如何在 Express 4 中将承诺的收益结果作为流发送?
Posted
技术标签:
【中文标题】如何在 Express 4 中将承诺的收益结果作为流发送?【英文标题】:How to send result of an yield on a promise as a stream in express 4? 【发布时间】:2016-06-15 00:28:00 【问题描述】:有什么方法可以将产生承诺的结果作为蒸汽发送?
在某些情况下 JSON 负载会很大,将其作为流发送是有意义的。
function aPromise()
// result of a postgres query. Using `pg`
return Promise.resolve([
key1: val1, key2: val2
]);
);
//express 4 router
let wrap = require('co-express');
router.get('/', wrap(function* (req, res, next)
let payload;
try
payload = yield aPromise();
catch (e)
return next(e);
res.json(payload);
));
【问题讨论】:
【参考方案1】:如果您要获取响应的整个对象并将其加载到内存中,那么将很难再合理地将其转换为流式传输。反正这里需要streaming JSON implementation。
Streaming postgress query 应该是 JSONStream 的一个很好的来源。
这里有两个例子说明如何让它工作,我做了一些假设:
您可以创建一个像这样的元组流:[key, data]
为您要放入的每个键,生成的 json 被发送出去。这假设您的数据有很多键。
res.set('content-type', 'application/json'); keystream.pipe(JSONStream.stringifyObject()).pipe(res)
您可以创建一个对象流,并希望将其作为数组中的项目返回,以用于最终的 json 响应。
res.set('content-type', 'application/json'); itemsstream.pipe(JSONStream.stringify()).pipe(res)
【讨论】:
方法aPromise
使用pg
一次性从postgres 中获取大量数据集。您还需要其他详细信息吗?
您需要了解您的数据结构并决定如何处理它。无论如何,将庞大的数据集拉入节点中的内存并不是一个好主意。这就是为什么你应该流式传输。用流媒体更新了我的答案
那样的话,使用生成器就得折腾了,对吧?
流是旧的生成器,req
和 res
对象默认支持它们(它们本身就是流),如果你想在这里使用生成器,你必须实现流 API 来翻译到发电机,然后从发电机返回。听起来很有趣但毫无意义;)
嗯,一些代码来展示如何在没有生成器和承诺的情况下实际执行上述操作将非常有帮助。以上是关于如何在 Express 4 中将承诺的收益结果作为流发送?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Bluebird 承诺 NodeJS Express
在 Express.js 中停止执行 Sequelize 承诺