修改Express.js请求对象

在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对象中缺less),但我希望能够在所有这些都可以访问这些信息。

另外,主机名可以在请求之间变化(机器有多个接口),所以我不能在应用程序启动时连接这个string。

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

有没有什么方法可以告诉Express我想要req对象有这些额外的信息? 有没有更好的办法做到这一点比我概述?

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

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

使用req.get获取Host头,如果需要的话,应该包含端口。

只要确保在之前添加它:

 app.use(app.router); 

您可以扩展express.request原型。

修改请求对象的最好方法是在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"; }); 

你可以使用中间件。 添加到你的app.configure块:

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

每个请求都会变得非常棘手,然后通过next()返回到正确的url-block。