首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用expressjs将响应流式传输到客户端时出现问题

使用expressjs将响应流式传输到客户端时出现问题
EN

Stack Overflow用户
提问于 2014-08-08 22:44:47
回答 2查看 23.4K关注 0票数 14

当我使用Nodejs/Expressjs时,我真的很难理解如何将数据传输回我的客户端。

我正在从我的数据库中抓取大量数据,并且是分块进行的,我希望在获得数据时将这些数据流回客户端,这样我就不必在将其发送回之前将整个数据集作为json对象存储在内存中。

我想让数据以文件的形式流回来,即我想让浏览器询问我的用户如何处理下载的文件。我之前创建了一个文件系统写入流,并将我的数据内容流式传输到文件系统,然后在完成后,我会将文件发送回客户端。我想消除中间人(在文件系统上创建临时文件),只将数据流式传输到客户端。

代码语言:javascript
运行
复制
app.get(
    '/api/export',
    function (req, res, next) {
        var notDone = true;
        while (notDone) {
            var partialData = // grab partial data from database (maybe first 1000 records);

            // stream this partial data as a string to res???

            if (checkIfDone) notDone = false;
        }
    }
);

我可以调用res.write(“一些字符串数据”),然后在完成时调用res.end()。但是,我不能百分之百确定这是否真的是在我编写时将响应流式传输到客户端。好像expressjs存储了所有的数据,直到我调用end,然后发送响应。这是真的吗?

使用expressjs将字符串数据块流式传输到响应的正确方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-08 23:17:07

您可以通过设置适当的头,然后只需写入响应对象来完成此操作。示例:

代码语言:javascript
运行
复制
res.writeHead(200, {
  'Content-Type': 'text/plain',
  'Content-Disposition': contentDisposition('foo.data')
});
var c = 0;
var interval = setInterval(function() {
  res.write(JSON.stringify({ foo: Math.random() * 100, count: ++c }) + '\n');
  if (c === 10) {
    clearInterval(interval);
    res.end();
  }
}, 1000);


// extracted from Express, used by `res.download()`
function contentDisposition(filename) {
  var ret = 'attachment';
  if (filename) {
    filename = basename(filename);
    // if filename contains non-ascii characters, add a utf-8 version ala RFC 5987
    ret = /[^\040-\176]/.test(filename)
      ? 'attachment; filename="' + encodeURI(filename) + '"; filename*=UTF-8\'\'' + encodeURI(filename)
      : 'attachment; filename="' + filename + '"';
  }

  return ret;
}

此外,Express/node不会缓冲写入套接字的数据,除非套接字暂停(显式或隐式地由于背压)。当节点处于该暂停状态时所缓冲的数据可以与已经缓冲的其它数据块组合,也可以不组合。您可以检查res.write()的返回值,以确定是否应继续写入套接字。如果返回false,则侦听'drain‘事件,然后再次继续写入。

票数 5
EN

Stack Overflow用户

发布于 2014-08-08 23:03:37

response对象已经是一个可写的流。Express会自动处理块数据的发送,所以你不需要做任何额外的事情,除了:

response.send(data)

您可能还想检查一下内置的管道方法http://nodejs.org/api/stream.html#stream_event_pipe

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25206141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档