Я бы хотел предоставить конечную точку в своем API, чтобы сторонние поставщики могли отправлять большие пакеты данных JSON. Я свободен в определении формата объектов JSON, но моя первоначальная мысль - простой массив объектов:
{[{"id":1, "name":"Larry"}, {"id":2, "name":"Curly"}, {"id":3, "name":"Moe"}]}
Поскольку в массиве может быть любое количество этих объектов, мне нужно было бы передать эти данные, прочитать каждый из этих объектов по мере их поступления и сохранить их где-нибудь.
TL; DR : потоковая передача большого массива объектов JSON из тела запроса Express POST.
Легко получить самые простые примеры, работающие, поскольку все они, кажется, демонстрируют эту идею, используя "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!");
});
Я получаю правильное считывание каждого объекта, поскольку он анализируется stream-json. Кажется, проблема в том, что поток блокируется во время обработки. Я могу нажать один раз и сразу получить ответ 200, но второе попадание блокирует поток, пока не закончится первый пакет, а второй также начинается.
Есть ли способ сделать что-то подобное без порождения дочернего процесса или что-то подобное? Я не уверен, что с этим делать, чтобы конечная точка могла продолжать получать запросы при потоковой обработке / анализе отдельных объектов JSON.