我熟悉nodejs中的流,我有一个问题: 我认为最简单的nodejs“echo服务器”即服务器,它简单地通过请求流接收回流到响应流. 它有效但有一点需要注意.客户端仅在关闭提交流后才接收数据
我认为最简单的nodejs“echo服务器”即服务器,它简单地通过请求流接收回流到响应流.
它有效但有一点需要注意.客户端仅在关闭提交流后才接收数据.
这是服务器代码:
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)执行缓冲魔术的结果.
谢谢您的帮助
好,我想我弄清楚我做错了什么.
server.js运行正常……卷曲破坏了管道.
显然,@ – 选项将stdin视为文件,即读取其全部内容然后提交它.我无法找到如何在读取内容时卷曲内容.我认为它不可行,因为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 ...
nodejs溪流和管道摇滚!