1

我目前正在开发一个使用打字稿的快速应用程序。我目前正在研究身份验证中间件,并且想知道您是否可以通过某种方式使中间件类型安全:

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;
}
4

2 回答 2

4

创建一个custom.d.ts 并覆盖和的Request接口expressexpress-serve-static-core

declare module 'express' {
  interface Request {
    token: Token;
  }
}

declare module 'express-serve-static-core' {
    interface Request {
        token: Token;
    }
}

这样RequestHandlerParams(通常是您的控制器)和RequestHandler(通常是您的中间件)都可以获得您的新Request接口。

然后将其添加到files您的部分tsconfig.json

"files": [
    "src/custom.d.ts"
]
于 2019-01-15T11:02:48.677 回答
0

你有没有尝试过 :

const token = req.token as Token;
于 2019-01-15T09:35:33.750 回答