Reputation: 5181
In express.js, I would like to provide an additional attribute on the request object for each of my URI listeners. This would provide the protocol, hostname, and port number. For example:
app.get('/users/:id', function(req, res) {
console.log(req.root); // https://12.34.56.78:1324/
});
I could of course concatenate req.protocol, req.host, and somehow pass around the port number (seems to be missing from the req object) for each one of my URI listeners, but I'd like to be able to do it in a way that all of them could access this information.
Also, the hostname can vary between request (the machine has multiple interfaces) so I can't just concatenate this string when the application launches.
The goal is to provide URI's to the consumer which point to further resources in this API.
Is there some sort of way to tell Express that I want req objects to have this additional information? Is there a better way to do this than what I'm outlining?
Upvotes: 46
Views: 66953
Reputation: 1231
Express was designed to support this in the response object, not the request. The response object support custom variables in res.locals
. See http://expressjs.com/en/4x/api.html#res.locals
This is particularly useful for typescript users. The locals
property is typed Record<string, any>
Upvotes: 1
Reputation: 123423
You can add a custom middleware that sets the property for each request:
app.use(function (req, res, next) {
req.root = req.protocol + '://' + req.get('host') + '/';
next();
});
Using req.get
to obtain the Host
header, which should include the port if it was needed.
Just be sure to add it before:
app.use(app.router);
Upvotes: 79
Reputation: 9471
You can use a middleware. Add this to your app.configure
block:
app.use(function (req, res, next) {
req.root = 'WHAT YOU WANT';
next();
});
Every request will go tough this function, and afterwards go to the right url-block thanks to next()
.
Upvotes: 4
Reputation: 3008
The best way to modify the request object is to add your own middleware function before the app.router declaration.
app.use(function(req, res, next){
// Edit request object here
req.root = 'Whatever I want';
next();
});
app.use(app.router);
This will modify the request object and every route will be able to access req.root property, so
app.get('/',function(req, res, next){
console.log(req.root); // will print "Whatever I want";
});
Upvotes: 9