无法使用expressjs将响应传输到客户端

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

我从我的数据库中抓取了大量数据,我正在做大块数据,我想将数据stream传回给客户端,这样我就不必将整个数据集作为json对象存储在内存中然后再发回。

我想数据作为一个文件stream,即我想让浏览器问我的用户如何处理下载的文件。 我以前正在创build一个文件系统写入stream,并将我的数据的内容stream到文件系统,然后完成后,我将文件发送回客户端。 我想消除中间人(在文件系统上创buildtmp文件)并将数据stream传输到客户端。

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(“一些string数据”),然后在完成时调用res.end()。 但是,我不是100%肯定,这是实际上响应客户端stream,因为我写。 似乎expressjs正在存储所有的数据,直到我打电话结束,然后发送响应。 真的吗?

使用expressjs将string数据块传输到响应的正确方法是什么?

你可以通过设置适当的头文件然后写入响应对象来完成。 例:

 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 /节点不缓冲写入套接字的数据,除非套接字被暂停(由于背压而显式或隐式地)。 当处于这个暂停状态时由节点caching的数据可以或不可以与已经缓冲的其他数据块组合。 您可以检查res.write()的返回值,以确定是否应该继续写入套接字。 如果它返回false,那么听“漏”事件,然后再继续写。

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

response.send(data)

您可能还想查看内置的pipe道方法, http://nodejs.org/api/stream.html#stream_event_pipe