将文件流式传输到客户端后,res.end() 永远不会发送

2023-12-19

我基本上试图将文件从 MongoDb 流式传输到客户端。文件接收没有问题,但是当流结束并且我尝试发送 request.end() 时,客户端永远不会收到它。

app.post('/upload', function (req, res) {
    var db = new mongo.Db('prueba', new mongo.Server("127.0.0.1", 27017));
    db.open(function (err) {
        if (err) return handleError(err);

        var gfs = Grid(db, mongo);
        console.log(req.filename);
        var uploadedSize = 0,
            uploadProgress = 0;
        idPdf = new ObjectId();  //cliente crea un id de mongo, el cual se utilizara para traer el recurso despues
        console.log(idPdf);

        var grabarm = req.pipe(gfs.createWriteStream({
            filename: 'test',
            _id: idPdf
        }));

        grabarm.on("close", function () {

            var tbuffer = gfs.createReadStream({filename: 'test'});

            tbuffer.on('open', function () {
                // This just pipes the read stream to the response object (which goes to the client)
                res.setHeader('Content-disposition', 'attachment; filename=pdfmongo.pdf');
                res.setHeader('Content-type', 'application/pdf');

                tbuffer.pipe(res);
            });

            tbuffer.on('data', function (chunk) {
                console.log("receiving data");
            });
            tbuffer.on("close", function () {

                console.log("fin"); //can see it in console
                res.end("ok file received");//client never sees this

            });

            tbuffer.on('error', function (err) {
                res.end(err);
            });
        });

    });

});

当可读流完成读取时,默认情况下,它会发出 end() 事件,该事件将调用可写流(res 流)上的 end() 事件。在这种情况下,您无需担心调用 end() 。

因此,在调用 end() 事件后,您的 res 将不再可写。因此,如果你想保持它可写,只需将 end: false 选项传递给 pipeline() 即可。举个例子:

fs.createReadStream("./image.png").pipe(res, { end: false });

,然后稍后调用 end() 事件。

顺便说一句,您应该监听“结束”事件而不是“关闭”事件来完成流,因为“关闭”并不明确意味着所有数据已被传输。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文件流式传输到客户端后,res.end() 永远不会发送 的相关文章

  • Angular js 服务器端过滤器和分页

    我有几个输入字段 我们可以使用带有搜索名称的输入字段作为示例 当有人在该字段中输入内容时 我希望能够过滤对象的结果 但我想做过滤器服务器端而不是客户端 我有一个包含大量记录的数据库 因此我不想返回所有记录并在客户端进行过滤 这确实会减慢速度
  • 在 mongodb 和 nodejs 中对博客和评级进行建模

    我有一个博客集合 其中包含用户给予的标题 正文和综合评分 另一个集合 评级 其架构引用了博客 以对象 ID 的形式对博客进行评级 如果有的话 的用户以及他们给出的评级 即 1 或 1 当特定用户按照 最新优先 的顺序浏览博客时 比如每页 4
  • 使用 ObjectId 键和字符串数组定义映射作为 mongoose 模式中的值

    我在为数据库创建 Mongoose 架构时遇到问题 我想创建一个以 objectId 作为键 以字符串值数组作为值的映射 我能得到的最接近的是 var schema new Schema map myId type mongoose Sch
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • Mongodb $push 嵌套数组

    我想向我的嵌套数组添加新数据 我的文档是 username erkin email email protected cdn cgi l email protection password b playlists id 58 name asd
  • 如何在 mongodb 聚合管道中使用 Javascript 对象?

    我有一个 JS 对象norm我想在 mongo 聚合管道中使用它 如下所示 var norm 1 1 2 1 16 3 1 413 4 1 622 5 1 6 6 1 753 7 3 001 8 2 818 9 3 291 10 2 824
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • 查询 MongoDB 集合中的字段。

    我正在尝试查询 mongodb 集合中的特定字段 这是我的代码和输出 Mongo m new Mongo DB db m getDB mydb DBCollection coll db getCollection student addin
  • 用 C++ 解析 HTTP 标头

    我正在使用curl 与服务器通信 当我发出数据请求时 我收到 HTTP 标头 后跟由边界分隔的 jpeg 数据 如下所示 我需要解析出 边界字符串 内容长度 我已将传入数据复制到 char 数组 如下所示 static size t OnR
  • Mongodb 数据建模/投票更新(向上和向下)

    Mongo 中有一个关于投票数据模型 更新查询的示例 http www mongodb org display DOCS MongoDB Data Modeling and Rails MongoDBDataModelingandRails
  • Nodemailer发送日历事件并将其添加到谷歌日历

    我正在尝试使用 nodemailer 将日历事件发送到 Gmail 帐户 这是我的代码 let transporter nodemailer createTransport host smtp gmail com port 587 secu
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre
  • 简单 AJAX Get 请求“待处理”

    我正在尝试实现一个简单的 AJAX GET 请求 该请求告诉服务器删除数据库中的文档 虽然我从服务器得到文档已删除的确认 但 Chrome 检查器显示该请求处于 待处理 状态 最终导致服务器错误 我做错了什么 HTML div class
  • Node.js 中的 PHP exit()/die() 等价物是什么

    什么是 PHP die http www php net manual de function die php http www php net manual de function die php 在 Node js 中等效吗 https
  • 一次更新猫鼬中的多个文档

    我有一个用户文档数组 每个用户都有关注者属性 它是一个数字 我只想将此属性增加 1 然后立即更新数据库中的所有这些用户文档 更多细节 在请求中 我有一组用户 id 我使用这些 id 进行查询以获取一组用户文档 const users awa
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • 尝试在 React 应用程序中连接到 MySQL 数据库时,无法读取未定义的属性(读取“查询”)错误

    我正在尝试连接到 MySQL 数据库并在单击按钮后在 React 应用程序中运行查询 一些它如何给出错误 我当前的代码如下所示 import mysql from mysql function App async function sync
  • Angular 2 - Http - 正确忽略空结果

    我有很多处理请求并简单返回 200 的 REST 端点 我注意到将结果映射为错误json 如果我尝试不进行任何类型的映射 我会看到浏览器警告它无法解析 XML 由于不返回任何内容是很常见的 我很好奇我应该如何处理响应 这是一个基本的代码示例
  • Phantom-node模块无法加载外部资源

    我正在开发一个nodejs服务器 它将发布的html呈现为pdf png或jpg https github com svenhornberg pagetox https github com svenhornberg pagetox ser
  • 如何执行“sudo nvm”?

    在我的 Mac 上 我想将一些需要 su 权限的包迁移到另一个节点版本 我使用 homebrew 安装 nvm 现在我需要执行 sudo nvm 或 reinstall packages将失败 me MacBook sudo nvm sud

随机推荐