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

时间:2018-05-21 11:33:30

标签: typescript express passport.js typescript2.0

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

2 个答案:

答案 0 :(得分:0)

我只是遇到了类似的问题,并像这样解决了它:

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 ...也许你是对的。如果有人对此情况有更好的答案,我会为之倾听。

答案 1 :(得分:-1)

如果您无法明确地从Express导入RequestResponseNextFunction,而是使用Node in-builts(签名稍有不同),则可能会发生这种情况。< / p>

尝试将以下内容添加到中间件定义中:

  

从'express'导入{Request,Response,NextFunction};

请参阅https://github.com/DefinitelyTyped/DefinitelyTyped/issues/26146#issuecomment-393386416