首页 > 解决方案 > 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 对象时继续接收请求。

标签: node.jsjsonexpressparsingstream

解决方案


推荐阅读