关于node.js中response的end事件是否一定要先监听了data事件才能被emit
伊谢尔伦
伊谢尔伦 2017-04-17 13:50:21
0
3
594
//server.js
var qs = require('querystring');
require('http').createServer(function(req, res){
    var body = '';
    req.on('data', function(chunk){
        body += chunk;
    });
    req.on('end', function(){
        res.writeHead(200);
        res.end('Done');
        console.log('\n  got name \033[90m' + qs.parse(body).name + '\033[39m\n');
    });
}).listen(3000);

//client.js
var http = require('http'), qs = require('querystring');
function send(theName){
    http.request({
        host: '127.0.0.1',
        port: 3000,
        url: '/',
        method: 'POST'
    }, function(res){
        res.setEncoding('utf8');
        //res.on('data', function(){return ;});
        res.on('end', function(){
            console.log('\n  \033[90m request complete!\033[39m');
            process.stdout.write('\n  your name: ');
        });
    }).end(qs.stringify({name: theName}));
}
process.stdout.write('\n  your name: ');
process.stdin.resume();
process.stdin.setEncoding('utf-8');
process.stdin.on('data', function(name){
    send(name.replace('\n', ''));
});

-----------------------------------------------------------------------------------------------摘自《了不起的Node.js》P98 - P99

  • 将client.js中监听data的事件注视掉的话 就不会执行end事件中的回调函数

  1. 希望能够帮忙解释一下, 谢谢.

  2. 顺便问一下 遇到这种问题应该如何解决 好让我下次能够自己解决, 谢谢.

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

Antworte allen(3)
Ty80

end是把数据读完后产生的事件。

小葫芦

我今天也遇到和题主一样的问题。查到了你的问题突然明白了。因为在服务器端读取完请求数据后触发服务器端的end事件,于是服务器端向客户端发送了head和Done。因此在客户端的流中还存在着来自服务器端的数据没有接收,因此是不会触发end事件的~
你可以在end事件中

res.on('data', function(chunk){console.log(chunk)});

这样你就会看到Done啦。接着就会触发end事件

PHPzhong

楼主,

一直不进data怎么办?


通过$.post提交表单,但是就是获取不到数据...

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage