如何流式传输API响应而不是将其全部加载到RAM

时间:2019-06-28 04:12:25

标签: node.js mongodb rest

我有一个提供大量数据的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中。我该如何流式传输?

1 个答案:

答案 0 :(得分:0)

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

看看这个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