gpt4 book ai didi

node.js - typescript :req.user 可能是 'undefined' - express 和 passport js

转载 作者:行者123 更新时间:2023-12-05 04:52:01 28 4
gpt4 key购买 nike

我有一个使用 Passport 工作的 Nodejs typescript 身份验证系统。

我的问题是,当我在路由中使用 req.user 时,我在 req.user 上收到此错误:Object is possibly 'undefined'.

这是 Typescript 的正常行为,但我正在使用中间件来保护我想在其中使用 req.user 的路由,这样 req.user 就不能未定义。

这是我扩展 Express.User 类型的地方:

import { users } from "@prisma/client";

declare global {
namespace Express {
interface User extends users {}
}
}

这是我用来保护登录用户路由的中间件:

export function checkIsAuthenticated(req: Request, res: Response, next: NextFunction) {
if (req.isAuthenticated()) {
if (!req.user) req.logOut();
else return next();
}
res.status(400).json({
errors: [{ message: "no user logged in" }],
});
}

这是获取用户信息的路径:

export function userRoute(req: Request, res: Response) { // defining the route
res.json({
id: req.user.id, // I'm getting the error in these 4 lines
username: req.user.username, //
email: req.user.email, //
role: req.user.role, //
});
}

router.get("/user", checkIsAuthenticated, userRoute); // using the route

我不想检查用户是否已定义,因为我不想在每条路线上都这样做,这不是一个好习惯。这就是中间件用于的原因。

我不擅长 Typescript,所以我需要一些帮助来修复它。 谢谢

最佳答案

I don't want to check if user is defined because I don't want to do it in every route and that's not a good practice.

我尝试满足该要求的第一个解决方案没有奏效,因此我将其删除。我留下了我的第二个解决方案,即:

但是,我想反驳说,如果您不小心在一条路线上使用了这些处理程序之一,那么检查用户请求并给自己一个有用的错误消息并没有错忘记进行身份验证了。看起来像这样:

type RequestWithUser = Request & {user: typeOfUserObject};
function assertHasUser(req: Request): asserts req is RequestWithUser {
if (!( "user" in req)) {
throw new Error("Request object without user found unexpectedly");
}
}

然后是这些路由的处理程序:

export function userRoute(req: Request, res: Response) {
assertHasUser(req);
// ...you can use `req.user` here...
});

Playground example

(您实际上并不需要明确的RequestWithUser 类型,您可以只使用asserts req is Request & {user: typeOfUserObject}。)

关于node.js - typescript :req.user 可能是 'undefined' - express 和 passport js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66614337/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com