我遇到了一个问题,我的tRPC配置无法访问请求对象上的快速会话。
我正在使用passport.js与谷歌和Facebook提供商,并在任何正常的http路由(不是在tRPC路由器),我得到的用户信息时,调用req.user
。
app.ts:
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不支持给予你用户很容易,但一定有某种变通办法,对吗?
2条答案
按热度按时间daolsyd01#
我不知道passport是如何工作的,因为我通常使用express会话,但也许概念是相同的
tldr:检查用户的req.session对象,然后将其添加到上下文返回的对象中
b4wnujal2#
我也有类似的问题,尽管是 typescript 。我注意到请求类型不同,必须键入不同的类型才能匹配,这样我就可以让我的会话可用。
如果您使用的是typescript,则可以如下所示键入上下文