一尘不染

来自http请求的Node.js响应未调用'end'事件而不包含'data'事件

node.js

因此,我有一个简单的客户端应用程序与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);

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


阅读 368

收藏
2020-07-07

共1个答案

一尘不染

'end'只调用时所有的数据被消耗,检查下面的参考:

事件:“结束”

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

请注意,除非完全消耗了数据,否则不会触发end事件。可以通过切换到流模式或重复调用read()直到结束来完成此操作。

但是,为什么需要致电.on('data',..)?答案是

如果您附加了数据事件侦听器,则它将把流切换到流模式,并且数据将在可用时立即传递给您的处理程序。

因此,基本上,通过添加data侦听器,它将流转换为流模式并开始使用数据。

请检查此链接以获取更多参考。

2020-07-07