我熟悉nodejs中的流,我有一个问题:
我认为最简单的nodejs“echo server”即服务器,它简单地管道回到响应流,无论它通过请求流接收到什么。 它有效但有一点需要注意。客户端仅在关闭提交流后才接收数据。 这是服务器代码:
var http = require('http')
var server = http.createServer(function (req, res) {
req.pipe(res);
});
server.listen(8000);
以下是我测试的方法:
执行以下操作正常
term1> node server.js&
term2> echo 'hello world!'|curl --no-buffer --data-binary @- 'http://localhost:8000'
hello world!
但是,它只能起作用,因为echo在完成后关闭了它的输出文件描述符,即服务器在客户端完成发送内容之前不会写任何东西:
term2>
term2> yes|curl --no-buffer --data-binary @- 'http://localhost:8000'
(这条线永远卡住了)
我希望yes
能够非常快地填充流缓冲区,所以我会开始看到y很快就会回来。不幸的是他们从来没有。
这是预期的吗?我应该如何使用流/管道以获得所需的效果? 顺便说一句,我不关心输出是否会以块的形式返回...我理解这将是流(或基础文件i / o)执行缓冲魔术的结果。
感谢您的帮助
答案 0 :(得分:2)
确定,
我想我弄清楚我做错了什么。
server.js
工作正常...... curl
正在破坏管道。
显然,@-
选项将stdin视为文件,即读取其完整内容然后提交它。我无法找到如何在读取内容时curl
管道内容。我认为它不可行,因为curl
想要将文件的内容视为普通的HTTP帖子格式值。
无论如何,我使用一个做我想做的简单的nodejs客户端修改了上面的例子:
term2> cat client.js
var http = require('http');
var req = http.request('http://localhost:8000', function(res) {
res.pipe(process.stdout);
});
process.stdin.pipe(req);
term2> yes|node client.js
y
y
...
nodejs溪流和管道摇滚!!