提问者:小点点

Typesafe Express中间件和路由?


我目前正在开发一个使用typescript的express应用程序。我目前正在开发一个认证中间件,我想知道你是否能以某种方式使中间件类型安全:

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'));
};

现在在我的路线中。ts:

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

我不得不写// @ts-ignore,因为它说< code>'(req: RequestWithToken,res: Response,next: () =

RequestWelToken的定义:

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

共2个答案

匿名用户

创建自定义.d.ts并覆盖快速和快速服务静态核心的请求接口

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

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

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

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

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

匿名用户

您是否尝试过:

const token = req.token as Token;