代码之家  ›  专栏  ›  技术社区  ›  Tsar Bomba

Node、Express和流式JSON数据到端点

  •  0
  • Tsar Bomba  · 技术社区  · 6 年前

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

    0 回复  |  直到 6 年前
    推荐文章