当前位置: 首页 > 面试题库 >

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

百里沛
2023-03-14
问题内容

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

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


问题答案:

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

事件:“结束”

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

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

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

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

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

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



 类似资料:
  • 我有一个小程序发送http请求并用TCP协议得到响应。 我的请求格式; 我从套接字逐行读取响应(在c#中使用NetworkStream和StreamReader),直到找到内容长度的标头。我存储长度,然后继续读取,直到找到空行。然后创建一个带有长度的缓冲区并接收其余的响应。 但有些响应没有内容长度标题。所以我的方法失败了。如果我不知道应该接收多少字节,我应该何时停止?

  • 响应事件 function onResponse(Request $request,Response $response); 在任何的控制器响应结束后,均会执行该事件,该事件预留于做分析记录。例如结合onRequest事件做慢日志记录。 function onRequest(Request $request, Response $response) { // TODO: Implement

  • 问题内容: 我正在使用Node的模块发出 HTTP 请求,但是在上,返回的块似乎并不满足完整的请求响应。这是我的代码: 有没有办法在结束请求之前等待完整的输出?难道我做错了什么?谢谢! 问题答案: 您还应该收听“结束”事件

  • 事情是这样的: 我正在为我的论文创建一个完全定制的服务器。在客户端,我希望能够请求服务器处理的数据库调用。然后,它以HTTP给出响应,以JSON提供查询结果。 我现在调用的方式是:使用JQuery的“getJSON()”方法。 虚拟示例: 在浏览器中运行带有此脚本的网页会在服务器端生成以下HTTP标头: 我的问题是:为了从浏览器上javascript的“result”参数中的响应中获得JSON负载

  • 我尝试通过Java执行一个SOAP请求并获得SOAP响应,然后从JSP页面调用它。我研究了许多网站,尝试了许多方法,但似乎无法让它工作。 我使用一些wsdl来测试http://www.webservicex.net/australianpostcode.asmx?wsdl 我一直收到这个错误 java.io.ioException:服务器返回HTTP响应代码:500的URL:HTTP://www.

  • 问题内容: 我有一个使用从扩展的类的子类 我将一个对象添加到框架-中。现在,当我按下任意键盘键时,不会调用任何方法,并且似乎没有窗口焦点。我也尝试过调用,但仍然没有响应。 如何使它响应按键? 问题答案: 您是否为面板设置了面板本身?另外,您可能需要将面板设置为可聚焦。我通过此代码对其进行了测试,它似乎可以正常工作