我想在我的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对象的同时继续接收请求。