最简单的Node.js回显服务器

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)执行缓冲魔术的结果。

谢谢您的帮助

Dio*_*des 4

好吧,我想我知道我做错了什么。工作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 流和管道摇滚!!