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

9

我正在熟悉nodejs中的流,有一个问题:

我觉得这是最简单的nodejs“回显服务器”,即服务器只需将收到的请求流数据简单地返回到响应流。虽然它可以工作,但有一个注意事项:客户端接收到的数据只有在关闭提交流之后才会返回。以下是服务器代码:

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

感谢您的帮助

1个回答

4
好的,我想我已经弄清楚自己做错了什么。 server.js没问题……是curl破坏了流水线。 显然,@-选项将标准输入视为文件,即读取其全部内容,然后提交它。我找不到如何使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
...

Node.js的流和管道非常棒!


管道(pipe)到底是做什么的?你是否总是在请求上调用它并将其传递给http.createServer函数的响应? - Jwan622

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接