如何发送巨大的数据池作为响应?

时间:2018-11-27 17:26:41

标签: javascript node.js json

我是 node.js 生态系统的新手,需要一些帮助。

我有一个控制器,该控制器在用户调用URL时触发。

async function get_all_information(req, res, next) {
    try {
        let start_date = req.query.start_date;
        let end_date = req.query.end_date;

        const binds = {};
        binds.start_date = start_date;
        binds.end_date = end_date;

        let query = `SOME LONG SQL STATEMENT`;

        await pool.query(query, binds, function (error, results) {
            if (error) throw error;

            console.log(results); // ~ 10 seconds

            res.send(JSON.stringify(results)); // ~ 15 seconds
        });
    } catch (error) {
        next(error);
    }
}

我尝试使用此代码,但遇到了问题。返回数据库的每月数据池具有227011 rows。似乎stringify方法创建了太大的JSON文件。当我尝试测试时,邮递员应用程序崩溃了。我尝试分析并注意到,每日数据池创建了约13 MB的JSON文件。我们可以说每月数据池可以创建约400 MB的JSON文件。

然后我尝试像这样流式查询行:

pool.query('HUGE SQL QUERY').stream({ highWaterMark: 5 }).pipe(res);

不幸的是,这样的代码会引发错误:

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string or Buffer. Received type object

有人可以告诉我如何正确地从MySQL数据库发送大量数据作为响应吗?


@akram我按照您的建议使用了fs软件包。我使用下一个代码创建JSON文件:

await pool.query(sql_statement, binds, function (error, results) {
    if (error) throw error;
    fs.writeFile("information.json", results, 'utf8', function (error) {
        if(error) throw error;
    });
});

此代码创建json文件,其每月数据池的大小约为3.5 MB。在编辑器中,我有下一条消息:

This document contains very long lines. Soft wraps were forcibly enable to improve editor performance.

该json文件还包含: enter image description here

在我看来太奇怪了。

1 个答案:

答案 0 :(得分:0)

尝试使用JSONStream https://github.com/dominictarr/JSONStream,我认为可以解决您的问题,JSONStream文档中有大量示例