【问题标题】:expressjs - piping to response stream doesn't workexpressjs - 到响应流的管道不起作用
【发布时间】:2015-05-03 08:37:16
【问题描述】:

我有这个基本的快递应用:

var express = require('express');
var app = express();
var PORT = 3000;
var through = require('through');


function write(buf) {
    console.log('writing...');
    this.queue('okkkk');
}

function end() {
    this.queue(null);
}

var str = through(write, end);


/* routes */
app.get('/', function(req, res){
    res.send("Hello!");
})


app.post('/stream', function(req, res){
    var s = req.pipe(str).pipe(res);
    s.on('finish', function() {
       console.log('all writes are now complete.'); // printed the first time
    });
});


/* listen */
app.listen(PORT, function () {
    console.log('listening on port ' + PORT + '...');
});

当我在启动服务器后第一次向/stream 端点发布一些数据时 我得到okkk 作为我所期望的响应。但是,在那之后,对/stream 端点的任何请求都会超时并且不会返回任何响应。

为什么会这样?这里到底发生了什么?

【问题讨论】:

  • 您正在通过管道发送请求,但您仍然必须通过响应来回答请求,或者至少以 res.end() 结束它,否则它会一直保持打开状态,直到超时。
  • 只有当我明确地调用.write() 时才需要end() 吗?无论如何我都试过了,现在有了它,我得到了一个空洞的回应。另外,如果我需要.end(),为什么在启动服务器后第一次工作?
  • 嗯,由于某种原因,响应没有完成并且一直保持打开状态,我不知道为什么,我以前从未见过有人通过管道发送请求,可能就是这样。跨度>
  • 嗯,请求是一个可读流,所以我认为你当然可以通过管道传输它。
  • 你可以管道它,但你必须结束它,你必须发送响应并关闭所有内容,否则它会一直处于不确定状态,我只是不知道在管道时如何执行此操作整个请求,也许其他人会这样做?

标签: node.js express stream


【解决方案1】:

我遇到了同样的问题,看起来 res 没有正确完成。所以我在我的流中添加了一个回调并结束了我自己的 que res。这解决了我的问题:

stream.on('end', () => res.end());
stream.pipe(res);

【讨论】:

  • 这种方法实际上破坏了我的代码,我得到的是空响应而不是流图像。
  • @yuranos 你用什么代替了它?
  • 它对我有用。我没有@Jatin 描述的问题。我是 nodejs 菜鸟,但我感觉最初的问题是关闭和对象/函数的生命周期。我的代码完全封闭在一个闭包中。无论如何,为什么不链接 on() 而不是将其作为单独的语句?
【解决方案2】:

当我将 req.pipe(str).pipe(res) 替换为 req.pipe(through(write, end)).pipe(res) 时它起作用了,这基本上确保为每个请求创建一个新的直通流实例。

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2021-11-06
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多