Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access current req object everywhere in Node.js Express

I wonder how to access req object if there's no 'req' parameter in callback.

This is the scenario:
In ExpressJs, I have a common function, it uses to handle something with 'req' object, but not pass req into it.

module.exports = {
    get: function(){
        var req = global.currentRequest;
        //do something...
    }
}

My current solution is that I write a middleware for all request, I put the 'req' in global variable, then I can access the 'req' everywhere with 'global.currentRequest'.

// in app.js
app.use(function (req, res, next) {
    global.currentRequest= req;
    next();
});

But I don't know if it's good? Can anyone have suggestions?
Thanks a lot!

like image 218
Sky Avatar asked Sep 06 '16 02:09

Sky


2 Answers

The only proper way is to pass the req object through as an argument to all functions that need it.

Stashing it in a global simply will not work because multiple requests can be in process at the same time if any requests use async calls as part of their processing and those multiple requests will stomp on each other making a hard to track down bug. There are no shortcuts here. Pass the current request as an argument to any code that needs it.

You cannot put request-specific data into a global in node.js, ever. Doing so will create an opportunity for two requests that are in-flight at the same time to stomp on each other and for data to get confused between requests. Remember, this is a server that is potentially handling requests for many clients. You cannot use synchronous, one-at-a-time thinking for a server. A node.js server may potentially have many requests all in flight at the same time and thus plain globals cannot be used for request-specific data.

There is no shortcut here. You will just have to pass the req object through to the function that needs it. If that means you have to change the function signature of several intervening functions, then so-be-it. That's what you have to do. That is the only correct way to solve this type of problem.

There are some circumstances where you may be able to use a closure to "capture" the desired req object and then use it in inner functions without passing it to those inner functions, but it does not sound like that is your function structure. We'd have to see a lot more of your real/actual code to be able to know whether that's a possibility or not.

like image 54
jfriend00 Avatar answered Nov 09 '22 03:11

jfriend00


Actually, this is possible with something like global-request-context

This is using zone.js which let you persist variables across async tasks.

like image 37
Tom Esterez Avatar answered Nov 09 '22 04:11

Tom Esterez