Typesafe Express中间件和路由?

时间:2019-01-15 09:27:44

标签: node.js typescript express

im目前正在使用打字稿的快速应用程序上工作。我目前正在开发身份验证中间件,想知道是否可以通过以下方式使中间件类型安全:

authenticateJwt = (
  req: RequestWithToken,
  res: Response,
  next: () => void
) => {
// Append the decoded req.token to the req header so we can use it internally
const token = req.token;

// @ts-ignore
this.verifyJwt(token)
  .then((decoded: Token) => {
    req.token = decoded;
    next();
  })
  .catch(() => res.status(401).send('Unauthorized'));
};

现在在我的routes.ts中:

router.get(
  '/me',
  // @ts-ignore
  jwtService.authenticateJwt,
  userController.getProfileFromUser
);

我必须写// @ ts-ignore,因为它说'(req: RequestWithToken, res: Response, next: () => void) => void的类型不是RequestHandlerParams

RequestWithToken的定义:

export interface RequestWithToken extends Request {
  token: Token;
}
export interface Token {
  username: string;
}

2 个答案:

答案 0 :(得分:2)

创建一个custom.d.ts 并覆盖Requestexpress的{​​{1}}接口

express-serve-static-core

通过这种方式,declare module 'express' { interface Request { token: Token; } } declare module 'express-serve-static-core' { interface Request { token: Token; } } (通常是您的控制器)和RequestHandlerParams(通常是您的中间件)都获得了新的RequestHandler接口。

然后将其添加到Request的{​​{1}}部分:

files

答案 1 :(得分:0)

您是否尝试过:

const token = req.token as Token;