首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问tRPC createContext (速成)中的用户对象

无法访问tRPC createContext (速成)中的用户对象
EN

Stack Overflow用户
提问于 2022-10-15 01:14:41
回答 3查看 173关注 0票数 0

我遇到了一个问题,我的tRPC配置无法访问请求对象上的快速会话。

我与谷歌和facebook提供商一起使用passport.js,在任何正常的http路由(而不是在tRPC路由器上)上,我都会在调用req.user时获得用户信息。

app.ts:

代码语言:javascript
复制
import * as trpc from '@trpc/server';
import * as trpcExpress from '@trpc/server/adapters/express';

const appRouter = trpc
    .router()
    .mutation('addTodo', {
        input: z.string(),
        resolve: ({input, ctx}) => {
            // Add a todo
        },
    });

const app = express();
app.use(
    session({
        secret: 'use an env-variable here',
    }),
);
app.use(passport.initialize());
app.use(passport.session());

app.use(
    '/trpc',
    trpcExpress.createExpressMiddleware({
        router: appRouter,
        createContext: (ctx: trpcExpress.CreateExpressContextOptions) => {
            // === HERE LIES THE ISSUE ===
            console.log(ctx.req.user);
            //                   ^ THIS RETURNS UNDEFINED
            return ctx;
        },
    }),
);

app.get("ping", (req, res) => {
    console.log(req.user);
    //                ^ THIS RETURNS THE USER
    res.send("pong");
})

可以很容易地说,tRPC不支持用户,但是必须有某种解决办法,对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-12-04 17:36:31

我将这个添加到trpc使用的客户端取取器中。

代码语言:javascript
复制
{
  credentials: "include"
}
票数 0
EN

Stack Overflow用户

发布于 2022-10-27 03:12:36

我不知道护照是怎么工作的,因为我通常在快餐会上工作,但也许这个概念也是一样的。

代码语言:javascript
复制
function createContext(opts: trpcExpress.CreateExpressContextOptions) {
  let user = {};
  if (opts.req.session.user) {
    user = opts.req.session.user;
  }

  return {
    user
  };
}

type Context = inferAsyncReturnType<typeof createContext>;
const t = initTRPC.context<Context>().create();
const appRouter = t.router({
  hello: t.procedure.query(({ ctx, input }) => {
    console.log("user", ctx.req?.session?.user);
    console.log({ input });
    return "Hello world";
  }),

  session: t.procedure.query(({ ctx, input }) => {
    console.log({ input });
    ctx.req.session.user = { name: "jane" };
    return "session created";
  }),
});

app.use(
  "/trpc",
  trpcExpress.createExpressMiddleware({ router: appRouter, createContext })
);

tldr:为用户检查req.session对象,然后将其添加到上下文返回的对象中

票数 0
EN

Stack Overflow用户

发布于 2022-11-24 06:47:14

我也有类似的问题,尽管我有打字稿。我注意到请求类型是不同的,必须以不同的方式进行匹配,这样我就可以让会话可用。

如果您使用的是类型记录,您可以像这样键入上下文

代码语言:javascript
复制
import { CreateExpressContextOptions } from '@trpc/server/adapters/express'
import { Request } from 'express'
import session from 'express-session'

// create my session type by extending the session type from 'express-session' and adding my userId on it
export type Session = session.Session &
  Partial<session.SessionData> & { userId?: string }

// Replace the req object from trpc's CreateExpressContextOptions with the express request and add my session onto it
type ExpressRequest = Omit<CreateExpressContextOptions, 'req'> & {
  req: Request & { session: Session }
}

export const createContext = ({
  req,
  res,
}: ExpressRequest) => {
  return {
    req,
    res,
  }
}

export type Context = inferAsyncReturnType<typeof createContext>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74076025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档