gpt4 book ai didi

typescript - 扩展 Passport 用户参数的快速请求

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

我正在使用 Passport 来处理 Express 应用程序的身份验证。这会将用户设置为快速响应。我使用的是 TypeScript,因此在路由定义中将请求类型设置为 Request 将会出错,因为 Express Request 上不存在用户对象。关于延长请求有很多问题,可以通过declaration mergingextending 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,以前从未遇到过这个问题。

最佳答案

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

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...也许你是对的。如果有人对这种情况有更好的答案,我会洗耳恭听。

关于typescript - 扩展 Passport 用户参数的快速请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447958/

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