typescript - Få inte cookies i trpc-kontext


Så jag har trpc uppsatt med next.js och jag försöker göra ssr där jag hämtar användaren innan sidladdning med trpc.useQuery-hooken, men jag får inte kakan med JWT-token i trpc-kontexten

jag har den här koden på sidan [username].tsx:

const UserPage: NextPage = () => {
  const router = useRouter();
  const username = router.query.username as string;

  const user = trpc.useQuery([
    "user.by-username",
    {
      username,
    },
  ]);

  return <Text>{user?.data?.id}</Text>;
};

export default UserPage;

och den här koden i trpc-kontexten, där jag inte kan console.loga kakorna:

export const createContext = (opts?: trpcNext.CreateNextContextOptions) => {
  const req = opts?.req;
  const res = opts?.res;

  console.log(req?.cookies) // i don't get cookies here

  const user = jwt.verify(req?.cookies.token as string, process.env.JWT_SECRET as string) as User

  return {
    req,
    res,
    prisma,
    user
  };
};

type Context = trpc.inferAsyncReturnType<typeof createContext>;

export const createRouter = () => trpc.router<Context>();

Svar #1

Låt mig kopiera över svaret från GitHub för progeny.

Det är en SSR-grej. Headers kopieras inte över som standard, så du måste inkludera följande kodsnutt:

export default withTRPC<AppRouter>({
  // @typescript-eslint/no-unused-vars
  config({ ctx }) {
    /**
     * If you want to use SSR, you need to
     * use the server's full URL
     * @link https://trpc.io/docs/ssr
     */
    return {
      headers() {
        return {
          cookie: ctx?.req?.headers.cookie,
        };
      },
    }
  }
})

Det finns en PR öppen för att förbättra dokumentationen om detta.

Svar #2

Jag tror att det du saknar är att vidarebefordra rubrikerna från webbläsaren.

Detta är magin du letar efter: https://github.com/trpc/examples-next-prisma-starter-websockets/blob/daf54ca6576f3e290aa4f36dc7d0ff1eb718b716/src/pages/_app.tsx#L79

Vi har ett öppet ärende för att förbättra detta :) https://github.com/trpc/trpc/issues/1811

Relaterade artiklar