我有一个expressjs应用程序,在特定的路由上,我调用了一个函数,该函数通过使用res.json数据库文档作为参数来响应数据库中的用户。我使用基于promise的库,并且想在将数据库文档放入响应中的回调内联。但是当我这样做时程序会失败。有人可以解释为什么吗?我还想知道为什么内联调用才能console.log真正起作用。两种方法res.json和之间有一些根本区别console.log吗?
res.json
console.log
这是一个有效和无效的示例。假定getUserFromDatabase()返回用户文档的承诺。
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); }
像这样使用时,该json函数会丢失其正确的this绑定,因为.then它将直接调用它而不参考res父对象,因此将其绑定:
json
this
.then
res
var getUserInline = function(req, res) { getUserFromDatabase().then(res.json.bind(res)); }