我想在我的API中提供一个端点,允许第三方发送大量JSON数据。我可以自由定义JSON对象的格式,但我最初的想法是一个简单的对象数组:
{[{"id":1, "name":"Larry"}, {"id":2, "name":"Curly"}, {"id":3, "name":"Moe"}]}
由于数组中可能有任意数量的这些对象,所以我需要将这些数据流化,在流式传输时读取每个对象,并将它们持久化到某个地方。
太长,读不下去了
:从Express POST请求的主体流式处理大量JSON对象。
很容易获得最基本的示例,因为它们似乎都在使用“fs”和使用文件系统来演示这一思想。
我一直在努力解决这个问题。现在,我想我已经使用“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!");
});
在streamjson解析每个对象时,我最终得到了一个正确的读取结果。问题似乎是线程在处理过程中被阻塞了。我可以点击一次并立即得到200的响应,但是第二次命中会阻塞线程,直到第一批处理完成,而第二批也开始了。
有没有什么方法可以做类似这样的事情而不产生子进程,或者类似的事情?我不确定该如何处理,这样端点就可以在流式处理/解析单个JSON对象时继续接收请求。