扩展对护照用户参数的快速请求

Posted

技术标签:

【中文标题】扩展对护照用户参数的快速请求【英文标题】:Extend express request for passport's user parameter 【发布时间】:2018-10-31 01:23:14 【问题描述】:

我正在使用 Passport 处理 Express 应用程序的身份验证。这会将用户设置为 Express 响应。我使用的是 TypeScript,因此在路由定义中将请求类型设置为 Request 会出错,因为 Express Request 中不存在用户对象。有很多关于扩展请求的问题,declaration merging 或extending the interface 但这些会导致另一个错误。我的文件如下所示:

import  Router, Request, Response   from 'express'
import  User as CustomUser  from './user'

interface IRequest extends Request 
  user: CustomUser


const router: Router = Router()

router.get('/', requiresLogin, (req: IRequest, res: Response) => 
  console.log(req.user)
  res.sendStatus(204)
)

但现在我在快速回调中得到以下 TypeScript:

Argument of type '(req: IRequest, res: Response) => void' is not assignable to parameter of type 'RequestHandlerParams'. Type '(req: IRequest, res: Response) => void' is not assignable to type '(RequestHandler | ErrorRequestHandler)[]'. Property 'includes' is missing in type '(req: IRequest, res: Response) => void'.

我最近升级到 TypeScript v2.8.3,以前从未遇到过问题。

【问题讨论】:

您使用的是哪个版本的@types/express?我刚刚用 TypeScript 2.8.3 和 Express 类型 4.11.1 尝试了上面的代码,并没有得到任何编译器错误。 我正在使用@types/express v4.11.1 和express v4.16.3。据我所知,tsconfig.json 中没有任何内容会导致问题(例如,我没有指定 typeRoots requiresLogin 的签名是什么样的? 我遇到了与 2.8.1 类似的问题 您找到解决方案了吗?我正在使用 TypeScript v3.4.5 和 @types/express 4.17.0 并看到同样的问题 【参考方案1】:

我刚遇到类似的问题,就这样解决了:

import  Router, Request, Response  from 'express';
import  User as CustomUser  from './user';

const router: Router = Router();

router.get('/', requiresLogin, (req: Request, res: Response) => 
  console.log(req.user as CustomUser);
  res.sendStatus(204);
);

我没有增加 Express.js 请求类型,而是简单地告诉 TypeScript,req.user 将是使用类型断言的 CustomUser 类型。这似乎与文档中的参考“有时您最终会遇到比 TypeScript 更了解值的情况”的确切场景。

https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions

现在我知道你在想什么了。 “如果没有用户怎么办?这不是违背了 Typescript 的目的吗?”。好吧,让我们看看这个。如果您使用的是 Passport.js,那么您不应该在没有用户的情况下走到这一步。此代码应该在您的 Passport 配置中的某个位置:

if (!user) 
  /** Set status code to Unauthorized */
  res.status(401);

  return next(err);

至于打败 Typescript……也许你是对的。如果有人对这种情况有更好的答案,我会全力以赴。

【讨论】:

以上是关于扩展对护照用户参数的快速请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在保存到数据库之前对密码进行哈希处理以与护照模块兼容(本地护照)

使用护照注册时的错误请求

Nodejs中的护照OAuth2Strategy是不是对访问令牌发出自动POST请求

nodejs护照身份验证令牌

环回护照手机登录

Angularjs + nodejs + 护照跨域请求