大家好,我是这里的新人,最近一直在学习 Node.js。目前,我在看 Node.js in Action 第一版,书中有一个例子:
var http = require('http');
var server = http.createServer(function(req, res) {
req.on('data', function(data) {
console.log('parsed', req.headers);
});
req.on('end', function() {
console.log('Done parsing');
res.end();
});
});
server.listen(3000);
这个代码其中的 req.on(‘data’ … 这一块始终不执行,不知道是为什么,req.on(‘end’ … 这一块可以正常运行,不过每一次刷新网页会返回两个 ‘Done parsing’
req.on('data')
只有在body有数据的时候才触发。 你可以用模拟post请求试下就可以触发了。
至于 网页会返回两个 ‘Done parsing’, 用调试的方式排查,断点在 end
函数里面,你就会看到有一个是 /favicon.ico
请求,浏览器自动请求网站图标用的。
多谢啊,那就是说明书中这个例子还是错了。
不过我又发现一个问题,就是在执行这个程序的时候,虽然这一段不执行,但网页是正常的,也就是说可以执行 req.on(‘end’) 这一段,请求正常结束。
可如果把这一段删了,只留下后面的一段。再执行的时候又有新的问题,就是网页始终处于加载状态,req.on(‘end’) 这一段不会执行。
请教一下这是什么原因?
@Jedi-walker 因为没有监听data事件,flowing的值是null,没有办法触发下面这个逻辑。 。而end事件是在read函数触发的。你可以改成这样就看到区别了。
var http = require('http');
var server = http.createServer(function(req, res) {
req._readableState.flowing = true
req.on('end', function() {
console.log('Done parsing');
res.end('ok');
});
});
server.listen(3000);
多谢啊,这个 flow(stream) 我还没接触,希望能尽快搞懂
@Jedi-walker 这个细节我还真不知道,这个属于 http底层实现了。建议先不用深入了解。
多谢多谢