Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Why cant I inline call to res.json?

Why cant I inline call to res.json?

Problem

I have and expressjs application and on a specific route I call a function that responds with a user from the database by calling res.json with the database document as parameter. I use promise based libraries and I wanted to inline the callback where I am putting the database document in the response. But the program fails when I do so. Can somebody explain why? I also wonder why inlined calls to console.log actually do work. Is there some fundamental difference between the two methods res.json and console.log?

Here is an example of what works and what does not work. Assume getUserFromDatabase() returns a promise of a user document.

//This works
var getUser = function(req, res) {
    getUserFromDatabase().then(function(doc) {
        res.json(doc);
    });    
} 

//This does not work (the server never responds to the request)
var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json);    
} 

//This works (the object is printed to the console)
var printUser = function(req, res) {
    getUserFromDatabase().then(console.log);    
} 
Problem courtesy of: Ludwig Magnusson

Solution

The json function loses its correct this binding when used like that since .then is going to invoke it directly without reference to the res parent object, so bind it:

var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json.bind(res));    
}
Solution courtesy of: Peter Lyons

Discussion

View additional discussion.



This post first appeared on Node.js Recipes, please read the originial post: here

Share the post

Why cant I inline call to res.json?

×

Subscribe to Node.js Recipes

Get updates delivered right to your inbox!

Thank you for your subscription

×