【问题标题】:Node.js response from http request not calling 'end' event without including 'data' event来自http请求的Node.js响应不调用'end'事件而不包括'data'事件
【发布时间】:2014-05-22 21:13:50
【问题描述】:

所以我有一个简单的客户端应用程序与 node.js 中的服务器端应用程序通信。在客户端,我有以下代码:

function send (name) {
    http.request({
        host: '127.0.0.1',
        port: 3000,
        url: '/',
        method: 'POST'
    }, function (response) {
        response.setEncoding('utf8');
        response.on('data', function (data) {
           console.log('did get data: ' + data);
        });
        response.on('end', function () {
            console.log('\n   \033[90m request complete!\033[39m');
            process.stdout.write('\n your name: ');
        });
        response.on('error', function (error) {
            console.log('\n Error received: ' + error);
        });
    }).end(query.stringify({ name: name})); //This posts the data to the request
}

奇怪的是,如果我不通过以下方式包含“数据”事件:

    response.on('data', function (data) {
       console.log('did get data: ' + data);
    });

响应的“结束”事件永远不会被触发。

服务器代码如下:

var query = require('querystring');
require('http').createServer(function (request, response) {
    var body = '';
    request.on('data', function (data) {
       body += data;
    });
    request.on('end', function () {
        response.writeHead(200);
        response.end('Done');
        console.log('\n got name \033[90m' + query.parse(body).name + '\033[39m\n');
    });
}).listen(3000);

我想知道当文档(据我所知)不需要您监听数据事件以关闭响应会话时,为什么会发生这种情况。

【问题讨论】:

    标签: javascript node.js http events


    【解决方案1】:

    'end' 仅在所有数据都被消耗后才会调用,请查看以下参考:

    事件:“结束”

    当不再提供数据时触发此事件。

    请注意,除非数据完整,否则不会触发结束事件 消耗。这可以通过切换到流动模式来完成,或者通过 反复调用 read() 直到结束。

    但是为什么你需要打电话给.on('data',..)?答案是

    如果你附加一个数据事件监听器,那么它将切换流 进入流动模式,数据将尽快传递给您的处理程序 它是可用的。

    所以基本上通过添加data 侦听器,它将流更改为流动模式并开始使用数据。

    请查看this link了解更多相关信息。

    【讨论】:

    • 感谢您提供的信息。我没有完全理解“流动模式”的含义,所以这是一个很好的解释。 IMO 有点奇怪,因为您希望它仍然会触发 data 事件,然后是 end 事件,但我猜此时流中存在暂停,必须保持状态而不向前推进。大约一年前,我浏览了一些为 node.js 出版的书籍,现在找不到了,所以也许它是新的?
    • 我还不得不说我必须认真地从 http 文档中挖掘才能找到它。该文档被严重隐藏,应该更好地强调。
    • @TheGamingArt 是的,我不得不挖掘很多东西才能找到这个信息,一开始我认为这是你代码中的一个错误:)
    • 我有.on('data').on('end') 永远不会启动
    • @bubakazouba 请发布一个关于它的新问题,并提供更多详细信息和代码
    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多