一尘不染

为什么我不能内联调用res.json?

node.js

我有一个expressjs应用程序,在特定的路由上,我调用了一个函数,该函数通过使用res.json数据库文档作为参数来响应数据库中的用户。我使用基于promise的库,并且想在将数据库文档放入响应中的回调内联。但是当我这样做时程序会失败。有人可以解释为什么吗?我还想知道为什么内联调用才能console.log真正起作用。两种方法res.json和之间有一些根本区别console.log吗?

这是一个有效和无效的示例。假定getUserFromDatabase()返回用户文档的承诺。

//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);    
}

阅读 256

收藏
2020-07-07

共1个答案

一尘不染

像这样使用时,该json函数会丢失其正确的this绑定,因为.then它将直接调用它而不参考res父对象,因此将其绑定:

var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json.bind(res));    
}
2020-07-07