当前位置: 首页 > 知识库问答 >
问题:

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

饶承宣
2023-03-14

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

我的问题是,当我在路由中使用req.user时,我在req.user上遇到以下错误:对象可能是“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

我不想检查是否定义了user,因为我不想在每条路由中都这样做,这不是一个好的做法。这就是中间件的原因。

我不擅长打字,所以我需要一些帮助来修理它。谢谢

共有2个答案

沈俊晤
2023-03-14

我不想检查是否定义了user,因为我不想在每条路由中都这样做,这不是一个好的做法。

我的第一个解决方案试图适应这个需求,但没有工作,所以我删除了它。我留下了我的第二个解决方案,它是:

但是,我要反驳的是,如果您在一条忘记进行身份验证的路由上意外地使用了这些处理程序之一,那么检查用户的请求并给自己一条很好的、有用的错误消息并没有什么错。这看起来应该是这样的:

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...
});

操场示例

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

柴嘉石
2023-03-14

null

export function userRoute(req: Request, res: Response) { // defining the route
    res.json({
        id: req.user!.id,               // you tell typescript that req.user for sure not. null
        username: req.user!.username,   //
        email: req.user!.email,         //
        role: req.user!.role,           //
    });
}

router.get("/user", checkIsAuthenticated, userRoute);
 类似资料:
  • JavaScript 有两个表示‘空’的值,其中比较有用的是 undefined。 undefined 的值 undefined 是一个值为 undefined 的类型。 这个语言也定义了一个全局变量,它的值是 undefined,这个变量也被称为 undefined。 但是这个变量不是一个常量,也不是一个关键字。这意味着它的值可以轻易被覆盖。 ES5 提示: 在 ECMAScript 5 的严格

  • PS:你能用Java8为Android 7.0及更高版本和Java7为更低版本做同样的apk吗?

  • null 和 undefined 概述 null与undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。 var a = undefined; // 或者 var a = null; 上面代码中,变量a分别被赋值为undefined和null,这两种写法的效果几乎等价。 在if语句中,它们都会被自动转为false,相等运算符

  • 原文: http://exploringjs.com/impatient-js/ch_undefined-null.html 许多编程语言都有一个名为null的“非值”。它表示变量当前未指向对象。例如,尚未初始化时。 相比之下,JavaScript 有两个:undefined和null。 13.1。 undefined与null 两个值都非常相似,并且通常可互换使用。因此它们的区别是微妙的。语言本

  • Javascript undefined 属性 undefined -- 表示未定义的值 语法: undefined; 说明: undefined 是全局属性,代表未定义的值。 示例: var u; console.log( u ); 结果: >>> undefined