我是 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.
在我看来太奇怪了。
答案 0 :(得分:0)
尝试使用JSONStream https://github.com/dominictarr/JSONStream,我认为可以解决您的问题,JSONStream文档中有大量示例