nodejs用http模块写的简单程序,服务器端获取客户端发送名字发生的问题,为何此处代码没有运行到,求解答?

发布于 2022-09-04 12:27:04 字数 1558 浏览 16 评论 0

代码运行后,第一次客户端上有显示your name: ,第一次之后再输其它名字时都没有显示your name: ,但是服务器端可以正常显示从客户端得到的名字。

以下是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('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', ''));
});

截图左边是server,右边是client。
我试着把client的这段代码删掉,结果似乎仍不影响正常运行。

res.on('end', function () {
            console.log('\n  \033[90m✔ request complete!\033[39m');
            process.stdout.write('\n  your name: ');
        });

为什么这段代码没有运行到呢?

图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一片旧的回忆 2022-09-11 12:27:04

HTTP responses, on the client是一个Readable Streams,它的end事件只有在数据全部被consumed的时候才会触发. 在你的client.js修改send函数,添加res.on('data',...)处理, 如果你对数据不care,也可以使用res.resume()。 你自己选一个吧!

function send (theName) {
    http.request({ host: '127.0.0.1', port: 3000, url: '/', method: 'POST' }, function (res) {
        res.setEncoding('utf8');
        // consume the data
        res.on('data', (chunk) => {
          console.log(`BODY: ${chunk}`);
        });
        // if you don't care the data using the next code 
        // res.resume();
        res.on('end', function () {
            console.log('\n  \033[90m✔ request complete!\033[39m');
            process.stdout.write('\n  your name: ');
        });
    }).end(qs.stringify({ name: theName }));
}

Note: The 'end' event will not be emitted unless the data is completely consumed. This can be accomplished by switching the stream into flowing mode, or by calling stream.read() repeatedly until all data has been consumed.

平定天下 2022-09-11 12:27:04

end检测的是data事件结束的的,所以你要表明data事件才可以的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文