【问题标题】:Node.js - res.end and res.write can accept a callback functionNode.js - res.end 和 res.write 可以接受回调函数
【发布时间】:2013-07-16 23:01:58
【问题描述】:

在使用 Node.js 创建基本 HTTP 服务器时,我注意到“http.ServerResponse”对象的 res.writeres.end 方法都可以接受如下回调函数:

require('http').createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});

    res.write('Hello ', function() { console.log('here 1'); });
    res.end(' World', function() { console.log('here 2'); });
}).listen(1337, '127.0.0.1');

'Hello World'在浏览器中输出,'here 1'和'here 2'在终端中输出。

但是,这些回调参数在任何地方都没有记录,例如 http://nodejs.org/api/http.html#http_response_end_data_encoding,除非我遗漏了什么。

我真的可以使用这些回调函数吗?我有一个有趣的用例。还是它们是一些内部使用的东西,应该避免?

【问题讨论】:

标签: node.js callback


【解决方案1】:

这似乎是一个“功能”。它实际上是要在正文中使用的编码,但是 net 模块的工作方式是第二个参数是可选的回调。 栈是这样的(大约)

res.write(data, encoding)
res._send(data, encoding)
res._writeRaw(data, encoding)
res.socket.write(data, encoding, cb)

在最后一点,参数的数量从 2 变为 3。数据和编码为数据、编码、可选回调。所以发生的事情是你的函数(作为编码参数)被传递给 socket.write ,其中编码是可选的。

这可能被认为是一个错误,因为您无法从响应写入方法中推送所有三个参数。我建议非常小心地使用它。

【讨论】:

  • 很好的分析。我建议绝对不要使用它。它起作用的唯一原因是由于 javascript 的超级松散/动态类型。在任何时候,有人可能决定对他们的代码更严格一点,它会突然停止工作。但更重要的是,它只是令人困惑/hacky 的代码。真正的 hack 恰好在此刻起作用。
  • 它在 master 分支中似乎也有所不同,因此可能甚至还不能工作。
  • 这里是编码变成回调的实际点。 github.com/joyent/node/blob/…
  • 是的,我只是在查看更改,它发生在 net.js 中的版本稍旧(我检查过的)
猜你喜欢
  • 2013-10-03
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
相关资源
最近更新 更多