修改Express.js请求对象

时间:2012-09-20 17:55:29

标签: node.js express

在express.js中,我想为每个URI侦听器的请求对象提供一个附加属性。这将提供协议,主机名和端口号。例如:

app.get('/users/:id', function(req, res) {
  console.log(req.root); // https://12.34.56.78:1324/
});

我当然可以连接req.protocol,req.host,并以某种方式传递我的每个URI侦听器的端口号(似乎从req对象中丢失),但我希望能够这样做是为了让所有人都可以访问这些信息。

此外,主机名可以在请求之间变化(机器有多个接口),因此我不能在应用程序启动时连接此字符串。

目标是向消费者提供URI,指向此API中的更多资源。

是否有某种方式告诉Express我希望req对象有这些附加信息?有没有比我概述的更好的方法呢?

5 个答案:

答案 0 :(得分:51)

您可以添加自定义中间件,为每个请求设置属性:

app.use(function (req, res, next) {
    req.root = req.protocol + '://' + req.get('host') + '/';
    next();
});

使用req.get获取Host标头,如果需要,应包括端口。

请务必在之前添加:

app.use(app.router);

答案 1 :(得分:35)

您可以扩展express.request原型。

答案 2 :(得分:6)

修改请求对象的最佳方法是在app.router声明之前添加自己的中间件函数。

    app.use(function(req, res, next){
      // Edit request object here
      req.root = 'Whatever I want';
      next();
    });
    app.use(app.router);

这将修改请求对象,每条路线都可以访问 req.root 属性,所以

    app.get('/',function(req, res, next){
      console.log(req.root); // will print "Whatever I want";
    });

答案 3 :(得分:2)

您可以使用中间件。将其添加到app.configure块:

app.use(function (req, res, next) {
  req.root = 'WHAT YOU WANT';
  next();
});

每个请求都会强制执行此功能,然后通过next()转到正确的url-block。

答案 4 :(得分:1)

响应对象支持res.locals中的自定义变量。参见http://expressjs.com/en/4x/api.html#res.locals

这对于打字稿用户特别有用。 locals属性的类型为Record<string, any>