在项目中扩展 express.Request

ath*_*h88 1 express typescript

我是 Typescript 的新手,请耐心等待。

我正在开发基于 Express 的 Web 服务。我想让一个早期的中间件在请求对象上设置一个日志对象,然后在请求处理程序流中使用它。

中间件和最终请求处理程序组织在不同的文件中。

集中扩展 express.Request-object 以允许在没有类型警告的情况下使用此日志记录对象的最佳方法是什么?

只是为了展示我拥有和想要的:

实例化表达并设置我的日志对象的文件:

const app = express();
const log = console;

app.use((req: express.Request, res: express.Response, next: express.NextFunction) => {
    req.log = log;
    next();
});
Run Code Online (Sandbox Code Playgroud)

请求处理程序:

(req: express.Request, res: express.Response): void => {
    req.log("request was made");
    res.send();
}
Run Code Online (Sandbox Code Playgroud)

Pas*_*asi 5

您可以express.Request像这样扩展对象:

declare global {
  namespace Express {
    interface Request {
      log(...params: any[]): void
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想更清楚地区分Request原版类型和增强版本,您可以执行以下操作:

interface RequestWithLogging extends express.Request {
  log(...params: any[]): void
}

app.get('/', (req: RequestWithLogging, res: express.Response) => {
  req.log('Log something')
  res.send('Hello World!')
})
Run Code Online (Sandbox Code Playgroud)