当我使用Nodejs/Expressjs时,我真的很难理解如何将数据传输回我的客户端。
我正在从我的数据库中抓取大量数据,并且是分块进行的,我希望在获得数据时将这些数据流回客户端,这样我就不必在将其发送回之前将整个数据集作为json对象存储在内存中。
我想让数据以文件的形式流回来,即我想让浏览器询问我的用户如何处理下载的文件。我之前创建了一个文件系统写入流,并将我的数据内容流式传输到文件系统,然后在完成后,我会将文件发送回客户端。我想消除中间人(在文件系统上创建临时文件),只将数据流式传输到客户端。
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将字符串数据块流式传输到响应的正确方式是什么?
发布于 2014-08-08 23:17:07
您可以通过设置适当的头,然后只需写入响应对象来完成此操作。示例:
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‘事件,然后再次继续写入。
发布于 2014-08-08 23:03:37
response
对象已经是一个可写的流。Express会自动处理块数据的发送,所以你不需要做任何额外的事情,除了:
response.send(data)
您可能还想检查一下内置的管道方法http://nodejs.org/api/stream.html#stream_event_pipe。
https://stackoverflow.com/questions/25206141
复制相似问题