Dio*_*des 6 pipe stream node.js
我逐渐熟悉nodejs中的流,并且有一个问题:
我认为,这是最简单的nodejs“回显服务器”,即简单地通过管道将其返回到响应流的服务器,无论它通过请求流接收到什么。它有效,但有一个警告。客户端仅在关闭提交流后才收到数据。这是服务器代码:
var http = require('http')
var server = http.createServer(function (req, res) {
req.pipe(res);
});
server.listen(8000);
Run Code Online (Sandbox Code Playgroud)
这是我如何测试它:
做以下工作就好了
term1> node server.js&
term2> echo 'hello world!'|curl --no-buffer --data-binary @- 'http://localhost:8000'
hello world!
Run Code Online (Sandbox Code Playgroud)
但是,它只能工作是因为echo在完成后会关闭其输出文件描述符,即,服务器直到客户端发送完东西之后才会写任何东西:
term2>
term2> yes|curl --no-buffer --data-binary @- 'http://localhost:8000'
Run Code Online (Sandbox Code Playgroud)
(这条线永远卡住了)
我希望yes
它将很快填充流缓冲区,因此我将开始看到y很快恢复。不幸的是,他们从来没有这样做。
这是预期的吗?我应该如何使用溪流/管道以达到预期的效果?顺便说一下,我不在乎输出是否会成块返回……我知道那是流(或底层文件I / O)执行缓冲魔术的结果。
谢谢您的帮助
好吧,我想我知道我做错了什么。工作server.js
正常……正是它curl
破坏了管道。显然,该@-
选项将 stdin 视为文件,即读取其完整内容然后提交。我找不到如何curl
在读取内容时通过管道传输内容。我认为它不可行,因为curl
想要将文件的内容视为普通的 HTTP post 表单值。
无论如何,我使用一个简单的 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
...
Run Code Online (Sandbox Code Playgroud)
Nodejs 流和管道摇滚!!