【问题标题】:How to parse Json data by chunks in NodeJs如何在 NodeJs 中按块解析 Json 数据
【发布时间】:2020-03-25 22:50:53
【问题描述】:

我正在创建一个 REST API,它从 Internet 获取原始数据,然后对其应用正则表达式并以 JSON 格式返回。

这是我将数据获取为 JSON 的函数。
首先,我使用 got() 获取原始数据,而不是应用 ANIME_LIST_REGEX.exec() 使用正则表达式对其进行过滤以使其成为 JSON 格式。

async function getAnimeList(url) {
const {body} = await got(url);

let ANIME_LIST_DATA = ANIME_LIST_REGEX.exec(body)

if (!ANIME_LIST_DATA) {
    return null;
}

return {
    animeList: ANIME_LIST_DATA[1]
};

}

在此端点中,我从第一个函数中检索数据并解析 JSON,然后将其作为响应返回。

app.get('/anime-list', async (req, res, next) => {
    const appData = await getAnimeList(URL_BASE_ANIME_LIST);
    var listJson = JSON5.parse(appData.animeList)
    res.json(listJson)
})

问题是返回的数组非常大(5000 个 js 对象条目)并且请求需要很长时间才能返回并显示数组
我想要做的是每次调用函数或到达端点时返回该数组的一个块。
尝试了几种方法,但都没有任何意义。
有人有想法吗?

【问题讨论】:

  • 您需要 JSON5,​​还是实际上只是 JSON?
  • 我建议根本不要解析和重新字符串化 JSON 文本。只需直接发送appData 字符串,只需确保设置像res.json 这样的内容类型标头即可。
  • 不是每个请求都调用一次 getAnimeList
  • @Bergi :是的,我可以做到。但我的问题是返回的数组很大,返回响应需要很多时间。我想知道是否有一种方法可以在每次调用函数时仅获取部分数据(例如,每次按下按钮时都会加载更多数据而不是整个数据)
  • 这将取决于您的 getAnimeList 函数,尤其是您自己从中获取数据的 API 是否支持这一点。但是,是的,一般来说是可以的,它被称为“分页”。

标签: javascript node.js json asynchronous


【解决方案1】:

您可以使用Array.prototype.splice() 将大数组拆分为一个小块。要确定块的范围,您可以将查询传递给端点。

app.get("/anime-list", async (req, res, next) => {
  const appData = await getAnimeList(URL_BASE_ANIME_LIST)
  var listJson = JSON5.parse(appData.animeList)

  const from = req.query.from || 0
  const count = req.query.count || 100
  res.json(listJson.splice(from, count))
})

但是,正如其他人所提到的,每个请求调用 getAnimeList() 会导致另一个性能问题。我强烈建议你重构函数来缓存结果。

【讨论】:

  • 我想你的意思是slicesplice 改变数组,这不是你想要的。
  • 是的,我认为我需要缓存未来请求的结果,问题是第一个请求数据的用户(当缓存尚未填充时)将不得不等待很多。我不知道我是否可以像定期缓存一样实现程序运行函数本身并填充缓存(+保持最新)。
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
相关资源
最近更新 更多