一个书中的示例无法解决
发布于 4 年前 作者 Jedi-walker 2594 次浏览 来自 问答

大家好,我是这里的新人,最近一直在学习 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’

6 回复

req.on('data') 只有在body有数据的时候才触发。 你可以用模拟post请求试下就可以触发了。 至于 网页会返回两个 ‘Done parsing’, 用调试的方式排查,断点在 end函数里面,你就会看到有一个是 /favicon.ico 请求,浏览器自动请求网站图标用的。

@abiuDoIT

多谢啊,那就是说明书中这个例子还是错了。

不过我又发现一个问题,就是在执行这个程序的时候,虽然这一段不执行,但网页是正常的,也就是说可以执行 req.on(‘end’) 这一段,请求正常结束。

可如果把这一段删了,只留下后面的一段。再执行的时候又有新的问题,就是网页始终处于加载状态,req.on(‘end’) 这一段不会执行。

请教一下这是什么原因?

@Jedi-walker 因为没有监听data事件,flowing的值是null,没有办法触发下面这个逻辑。 image.png。而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);

@theanarkh

多谢啊,这个 flow(stream) 我还没接触,希望能尽快搞懂

@Jedi-walker 这个细节我还真不知道,这个属于 http底层实现了。建议先不用深入了解。

回到顶部