扩展对护照用户参数的快速请求
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……也许你是对的。如果有人对这种情况有更好的答案,我会全力以赴。
【讨论】:
以上是关于扩展对护照用户参数的快速请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在保存到数据库之前对密码进行哈希处理以与护照模块兼容(本地护照)