13

我有 expressjs 应用程序,并且在特定路线上,我调用了一个函数,该函数通过res.json将数据库文档作为参数调用来响应数据库中的用户。我使用基于承诺的库,我想内联回调,我将数据库文档放入响应中。但是当我这样做时程序失败了。有人可以解释为什么吗?我也想知道为什么内联调用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);    
} 
4

1 回答 1

12

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

var getUserInline = function(req, res) {
    getUserFromDatabase().then(res.json.bind(res));    
}
于 2013-08-02T14:34:12.903 回答