Узел, Express и синтаксический анализ потока JSON в конечной точке без блокировки потока - PullRequest
1 голос
/ 18 июня 2019

Я бы хотел предоставить конечную точку в своем 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...