尽管我喜欢
Lin Du的答案,但它可能不适用于您可能有不同会话类型的用例(一个用于用户界面,一个用于管理面板等--在这种情况下,会话对象不是常量)。
最终,我创建了CustomRequestHandlers来处理不同类型的会话类型。
import session from 'express-session';
import { ParamsDictionary } from 'express-serve-static-core';
import { ParsedQs } from 'qs';
import { NextFunction, Request, RequestHandler, Response } from 'express';
interface CustomUserSession extends session.Session {
user: {
username: string;
};
}
interface RequestWithSession<
P = ParamsDictionary,
ResBody = any,
ReqBody = any,
ReqQuery = ParsedQs,
LocalsObj extends Record<string, any> = Record<string, any>,
> extends Request<P, ResBody, ReqBody, ReqQuery, LocalsObj> {
session: CustomUserSession;
}
export interface UserReqHandler<
P = ParamsDictionary,
ResBody = any,
ReqBody = any,
ReqQuery = ParsedQs,
LocalsObj extends Record<string, any> = Record<string, any>,
> extends RequestHandler {
(req: RequestWithSession<P, ResBody, ReqBody, ReqQuery, LocalsObj>, res: Response<ResBody, LocalsObj>, next: NextFunction): void;
}
完成这个后,我只需要这样使用它
export const handleUserAuth: UserReqHandler = async (req, res, next) => {
req.session.user = {
username: 'foo',
};
}
我们可以根据需求创建多个Req处理程序。
Session
实例具有此用户属性,但实际上(在运行时)并非如此。Express 将执行您的函数,并传递一个带有会话的请求,但该会话将不具有此用户。 - Nitzan Tomer