【问题标题】:How to stream an API response rather than load it all into RAM如何流式传输 API 响应而不是将其全部加载到 RAM 中
【发布时间】:2019-06-29 00:03:27
【问题描述】:

我有一个提供大型数据集的 API。最初,该数据集是可管理的,但它每天都在增长,并开始使服务器陷入困境并导致超时和响应缓慢。目前,API 将整个响应加载到内存中,然后再发送给客户端。我想尽快流式传输响应。

我遵循了有关如何构建此 API 的在线指南, 从这里: https://www.freecodecamp.org/news/how-to-build-blazing-fast-rest-apis-with-node-js-mongodb-fastify-and-swagger-114e062db0c9/

我对其进行了修改以适合我的数据,并且效果很好。但是,我现在一直在尝试让它流式传输响应,坦率地说,我遇到了困难。我似乎无法在我的代码中采用许多在线示例来说明如何做到这一点。

这就是我想要改变的。

// Get All Metars
exports.getmetars = async (req, reply) => {
  try {
    const flights = await metars.find()
    return flights
  } catch (err) {
    throw boom.boomify(err)
  }
}

此代码当前在发送前将全部内容加载到 RAM 中。如何改为流式传输?

【问题讨论】:

  • 将数据定义为 flights 如果您只是简单地返回它,则不会帮助记忆
  • 它在metars.find期间“将其加载到内存中”;这将取决于 that 的工作方式。

标签: node.js mongodb rest


【解决方案1】:

您可以流式传输,但您可能还希望查看在端点上启用分页、过滤和/或排序。根据您链接的文章,我假设您使用的是 Mongoose。

看看这个streaming JSON.stringify package。自述文件底部有一个Mongoose example。对你来说,它看起来像这样:

// Get All Metars
exports.getmetars = (req, reply) => {
  try {
    new JsonStreamStringify(metars.find().stream()).pipe(reply)
  } catch (err) {
    throw boom.boomify(err)
  }
}

参考答案:https://stackoverflow.com/a/53852868/30697

另见:Stream from a mongodb cursor to Express response in node.js

【讨论】:

  • 是的,使用猫鼬。我最终从那篇文章中删除了一堆代码,几乎从头开始。我最终做的和你上面描述的完全一样。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2018-02-19
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多