node.js - Node、Express 和在端点中解析流式 JSON 而不阻塞线程
问题描述
我想在我的 API 中提供一个端点,以允许第三方发送大量 JSON 数据。我可以自由定义 JSON 对象的格式,但我最初的想法是一个简单的对象数组:
{[{"id":1, "name":"Larry"}, {"id":2, "name":"Curly"}, {"id":3, "name":"Moe"}]}
由于数组中可能有任意数量的这些对象,我需要将这些数据流式传输,在流式传输时读取这些对象中的每一个,并将它们保存在某个地方。
TL;DR:从 Express POST 请求的正文中流式传输大量 JSON 对象。
很容易获得最基本的示例,因为所有示例似乎都使用“fs”并与文件系统一起工作来证明这个想法。
我一直在努力解决这个问题的 Express 实现。在这一点上,我想我已经使用“stream-json”包完成了这项工作:
const express = require("express");
const router = express.Router();
const StreamArray = require("stream-json/streamers/StreamArray");
router.post("/filestream", (req, res, next) => {
const stream = StreamArray.withParser();
req.pipe(stream).on("data", ({key, value}) => {
console.log(key, value);
}).on("finish", () => {
console.log("FINISH!");
}).on("error", e => {
console.log("Stream error :(");
});
res.status(200).send("Finished successfully!");
});
我最终得到了每个对象的正确读数,因为它由 stream-json 解析。问题似乎是线程在处理过程中被阻塞。我可以点击一次并立即获得 200 响应,但第二次点击会阻塞线程,直到第一批完成,而第二批也开始。
有没有办法在不产生子进程的情况下做这样的事情,或者类似的事情?我不确定该怎么做,以便端点可以在流式传输/解析单个 JSON 对象时继续接收请求。
解决方案
推荐阅读
- c# - 如何检测表中哪一列的值已更新
- javascript - 如何在reactjs中的map函数中设置选定元素的样式
- javascript - 如何将 azure 广告集成到在 azure 中也使用 REST API 的 React Web 应用程序
- javascript - 如何在模板标签上条件渲染 vue.js?
- python - 删除重复的列表元素-python
- keras - Keras seq2seq 填充
- php - 数据库中字符串的本地和生产解码之间的区别
- swift - AVPlayer 需要很多时间才能从 url 开始播放歌曲
- javascript - 使用 paste.image.js 保存 Img
- php - 如何获取具有特定字符的数组?