使用Node.js创建基本HTTP服务器时,我注意到'res.write
'对象的res.end
和http.ServerResponse
方法都可以接受这样的回调函数:< / p>
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,除非我遗漏了什么。
我真的可以使用这些回调函数吗?我有一个有趣的用例。或者它们是一些内部使用的东西,应该避免吗?
答案 0 :(得分:3)
这似乎是一个“功能”。它实际上是指在主体中使用的编码,但网络模块的工作方式是第二个参数是可选的回调。 堆栈就像这样(约)
res.write(data, encoding)
res._send(data, encoding)
res._writeRaw(data, encoding)
res.socket.write(data, encoding, cb)
在最后一点,参数的数量从2变为3.数据和编码为数据,编码,可选回调。所以发生的事情是你的函数(作为编码参数)被传递给socket.write,其中编码可以是可选的。
这可能被视为一个错误,因为您无法从响应写入方法中推送所有三个参数。我建议非常小心地使用它。