我遇到了一个问题,我的tRPC配置无法访问请求对象上的快速会话。
我与谷歌和facebook提供商一起使用passport.js,在任何正常的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不支持用户,但是必须有某种解决办法,对吗?
发布于 2022-12-04 17:36:31
我将这个添加到trpc使用的客户端取取器中。
{
credentials: "include"
}发布于 2022-10-27 03:12:36
我不知道护照是怎么工作的,因为我通常在快餐会上工作,但也许这个概念也是一样的。
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对象,然后将其添加到上下文返回的对象中
发布于 2022-11-24 06:47:14
我也有类似的问题,尽管我有打字稿。我注意到请求类型是不同的,必须以不同的方式进行匹配,这样我就可以让会话可用。
如果您使用的是类型记录,您可以像这样键入上下文
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>https://stackoverflow.com/questions/74076025
复制相似问题