Typesafe Express 中间件和路由?

Posted

技术标签:

【中文标题】Typesafe Express 中间件和路由?【英文标题】:Typesafe Express Middleware and Routes? 【发布时间】:2019-06-09 07:05:21 【问题描述】:

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

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;

【问题讨论】:

【参考方案1】:

创建一个custom.d.ts 并覆盖expressexpress-serve-static-coreRequest接口

declare module 'express' 
  interface Request 
    token: Token;
  


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

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

然后将其添加到您的tsconfig.jsonfiles 部分:

"files": [
    "src/custom.d.ts"
]

【讨论】:

【参考方案2】:

你试过了吗:

const token = req.token as Token;

【讨论】:

如果我使用req: Request 而你写的内容则表明req.tokenRequest 类型上不存在 @MichelVorwieger 我忘记了,您还需要重新输入您的请求界面,如***.com/questions/37377731/… 它现在可以在我的中间件中使用,但快速路由器仍然抱怨 (req: Request, res: Response, next: () => void) => void 不是 RequestHandlerParams 类型 我通过覆盖Request 对象从express-serve-static-core 修复它 @MichelVorwieger,很高兴你解决了它。我仍然会要求您为该线程回答您自己的问题,而不仅仅是对我的回答发表评论。这也将帮助其他人。

以上是关于Typesafe Express 中间件和路由?的主要内容,如果未能解决你的问题,请参考以下文章

express中间件和路由教程

详解express搭建http服务,通过路由和中间件获取静态文件和动态数据的实现原理

Express中间件的应用-路由保护(登录限制)网站维护页面404

express中间件

express中的中间件

如何使用 express 中间件处理所有路由?