NodeJS Express。 res.send()分配给另一个var时失败

我正在使用Express v3.4.4。 当我尝试这样做:

var cb = res.send; cb(result); 

我收到一个错误:

  ...\node_modules\express\lib\response.js:84 var HEAD = 'HEAD' == req.method; TypeError: Cannot read property 'method' of undefined 

在代码中,工作一:

  workflow.on('someEvent', function () { res.send({ error: null, result: 'Result' }); }); 

不工作:

  workflow.on('someEvent', function () { var cb = res.send; cb({ error: null, result: 'Result' }); }); 

send实际上是对象res的function。 它试图使用res对象中的其他数据。 但是,当你这样做

 var cb = res.send; cb({...}); 

你只是使用函数对象send没有对res对象的引用。 这就是为什么它不工作。


如果你需要做这样的事情,那么像这样绑定res对象到send函数

 var cb = res.send.bind(res); 

现在

 cb({...}); 

也将工作。 因为res被绑定到send函数对象,并且结果函数被存储在cb

bind函数实际上是Function.prototype.bind

这是因为在JavaScript中, this方法内部的值绑定到了包含对象。

  • 调用res.send()使得send函数内部的值为res
  • 相反,调用未绑定的版本cb()这个值并不是预期的。

Express.js的内部实现依赖于this绑定的事实,并且很可能包含一个像this.method这样的expression式,该expression式导致TypeError: Cannot read property 'method' of undefined错误。