6

我有这段代码:

var app = require('http').createServer(function(req, res){
    console.log(req);
    req.addListener('end', function () {
        fileServer.serve(req, res);

    });
});

var statics = require('node-static');
var fileServer = new statics.Server('./');

app.listen(1344, '127.0.0.1');

app.on('error', function(err){
    console.log(err);
})

它工作得很好,直到我做了一些更改,节点给出了一个错误,当我回去时,那个错误不再存在,而是像在end事件没有被触发之前那样工作。所以,里面的任何东西req.addListener('end', function (){});都不会被调用。

即使我运行另一个使用相同事件的 node.js,也不会被触发。就像请求的结束事件被破坏一样。但这怎么可能呢?

已经不是第一次发生了。上次我最终重新安装了节点(在尝试了很多不同的东西之后)。我宁愿找到解决方案,这样我才能理解问题!

注意:原始代码包括 socket.io 和其他类型的连接,但我刚刚粘贴了应用程序卡住的这段代码。

了解如何调试问题也很有用!

4

1 回答 1

14

@InspiredJW 指出这一点应该得到赞扬,因为我忘记了它,但毫无疑问,你的问题是因为可读流的变化。为了让end事件被调用,您要么必须将侦听器附加到data事件,要么必须调用stream.resume().

require('http').createServer(function(req, res){
    req.addListener('end', function () {
        // won't ever get called in node v0.10.3
    });
});

require('http').createServer(function(req, res){
    req.addListener('end', function () {
        // will get called in node v0.10.3 because we called req.resume()
    });
    req.resume();
});

require('http').createServer(function(req, res){
    req.on('data', function (chunk) {  });

    req.addListener('end', function () {
        // also will get called because we attached a data event listener
    });
});

http://nodejs.org/api/stream.html#stream_compatibility

于 2013-04-09T16:47:11.283 回答