【问题标题】:Attaching a stream in response in expresses/nodejs在 expresses/nodejs 中附加一个流作为响应
【发布时间】:2016-04-07 22:51:28
【问题描述】:

我在使用 ExpressJs 发送回流响应时遇到了困难。有人可以调查一下并帮助我了解我在这段代码中的错误所在吗?

这是我要发回的 .mp4 文件。

另外,我有我想要在 Mongo Grid 中读取的请求文件,如下所示

    { "_id" : ObjectId("5702b22fc327277b338a4229"), "filename" :      **"vsl_video1.mp4"**, "contentType" : "binary/octet-stream", "length" : 29442776, "chunkSize" : 261120, "uploadDate" : ISODate("2016-04-04T18:28:00.324Z"), "aliases" : null, "metadata" : null, "md5" : "33c0daecaf9d6d84408041dfe5724295" }

这是我的代码,它试图读取此文件并尝试将其附加到响应中

    filename = req.params.filename;
    MongoClient.connect(mongoUrl, function(err, db) {
      var gridReadStream, gridfs;
      gridfs = Grid(db, Mongo);
      gridReadStream = gridfs.createReadStream({
        filename: filename
      });
      console.log('after creating the read stream');
      console.log(filename);
      gridReadStream.pipe(res);
      db.close();
      return res.status(200);

当我发布请求时,我可以打印两个控制台日志。我确信 readstream 也可以正常工作(我测试写入本地文件,它确实将二进制数据写入该文件),所以由于某种原因,响应不起作用。

我在这里发布没有任何错误。我发现我的响应永远不会回来,而且在很长一段时间后它就会超时。

任何建议将不胜感激。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    来自this answer。也许尝试删除您的 res.status(200) 或执行以下操作

    gridReadStream.on('data', function(data) {
        res.write(data);
    });
    
    gridReadStream.on('end', function() {
        res.status(200).end();
    });
    

    完全不确定,很难

    【讨论】:

    • 谢谢。它似乎以这种方式工作。我能够在响应中获取该文件(通过 curl)。我必须保存该文件并播放 .mp4 以使其 100% 成功:)。如果 100% 有效,我会添加评论。
    • 但我想知道,为什么这在没有事件的情况下现在可以工作? gridReadStream.pipe(res);
    • 我的猜测是当你从handler函数返回时,express会直接关闭与客户端的连接。因此,即使您将流通过管道传输到 res,也不会向客户端发送任何数据(或不是全部)。
    • 很高兴我的回答对您有所帮助 :) 如果它解决了您的问题,您可以接受它!
    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2017-04-12
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多