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
并覆盖express
和express-serve-static-core
的Request
接口
declare module 'express'
interface Request
token: Token;
declare module 'express-serve-static-core'
interface Request
token: Token;
这样RequestHandlerParams
(通常是您的控制器)和RequestHandler
(通常是您的中间件)都可以获得新的Request
接口。
然后将其添加到您的tsconfig.json
的files
部分:
"files": [
"src/custom.d.ts"
]
【讨论】:
【参考方案2】:你试过了吗:
const token = req.token as Token;
【讨论】:
如果我使用req: Request
而你写的内容则表明req.token
在Request
类型上不存在
@MichelVorwieger 我忘记了,您还需要重新输入您的请求界面,如***.com/questions/37377731/…
它现在可以在我的中间件中使用,但快速路由器仍然抱怨 (req: Request, res: Response, next: () => void) => void
不是 RequestHandlerParams 类型
我通过覆盖Request
对象从express-serve-static-core
修复它
@MichelVorwieger,很高兴你解决了它。我仍然会要求您为该线程回答您自己的问题,而不仅仅是对我的回答发表评论。这也将帮助其他人。以上是关于Typesafe Express 中间件和路由?的主要内容,如果未能解决你的问题,请参考以下文章
详解express搭建http服务,通过路由和中间件获取静态文件和动态数据的实现原理