Node.js子进程中用async/await处理数据库查询异步等待问题
解决子进程中等待数据库查询Promise完成的问题
核心问题原因
你的调度器脚本调用返回Promise的查询函数后,没有等待Promise resolve就直接退出了——Node.js进程默认不会等待未处理的Promise完成,所以导致查询还没结束进程就终止了。
解决方案步骤
1. 修改调度器脚本,等待查询完成并输出结果
假设你的调度器文件名为scheduler.js,需要显式等待查询Promise完成,再将结果输出给父进程:
const { getReviewFilledInLastThirtyMins } = require('./你的查询模块路径'); // 使用async/await等待查询完成 async function executeQuery() { try { // 等待Promise resolve拿到查询结果 const recentReviews = await getReviewFilledInLastThirtyMins(); // 将结果转为JSON字符串输出到标准输出,方便父进程捕获 console.log(JSON.stringify(recentReviews)); } catch (err) { // 错误信息输出到标准错误 console.error(JSON.stringify({ error: err.message })); // 非0退出码标记执行失败 process.exit(1); } } executeQuery();
2. 父进程中监听子进程输出,获取查询结果
使用spawn调用子进程时,需要监听子进程的标准输出、错误输出和结束事件,来收集并处理结果:
const { spawn } = require('child_process'); // 启动调度器子进程 const schedulerProcess = spawn('node', ['scheduler.js']); let stdoutBuffer = ''; let stderrBuffer = ''; // 收集标准输出内容 schedulerProcess.stdout.on('data', (chunk) => { stdoutBuffer += chunk.toString(); }); // 收集错误输出内容 schedulerProcess.stderr.on('data', (chunk) => { stderrBuffer += chunk.toString(); }); // 子进程结束时处理结果 schedulerProcess.on('close', (exitCode) => { if (exitCode === 0) { // 解析JSON格式的查询结果 const recentReviews = JSON.parse(stdoutBuffer); // 这里可以对查询结果做后续处理 console.log('近30分钟的评论数据:', recentReviews); } else { // 解析错误信息 const errorInfo = JSON.parse(stderrBuffer); console.error('调度器执行失败:', errorInfo.error); } });
可选方案:用fork替代spawn(更适合Node.js进程间通信)
如果你的子进程也是Node.js脚本,使用fork可以更方便地通过IPC传递数据,无需手动处理JSON序列化:
调度器脚本修改:
const { getReviewFilledInLastThirtyMins } = require('./你的查询模块路径'); async function executeQuery() { try { const recentReviews = await getReviewFilledInLastThirtyMins(); // 通过IPC通道向父进程发送结果 process.send({ success: true, data: recentReviews }); } catch (err) { process.send({ success: false, error: err.message }); } finally { // 完成后退出子进程 process.exit(); } } executeQuery();
父进程代码:
const { fork } = require('child_process'); const schedulerProcess = fork('scheduler.js'); // 监听子进程发送的消息 schedulerProcess.on('message', (msg) => { if (msg.success) { console.log('查询结果:', msg.data); } else { console.error('执行出错:', msg.error); } }); // 监听子进程启动失败的情况 schedulerProcess.on('error', (err) => { console.error('子进程启动失败:', err); });
内容的提问来源于stack exchange,提问作者SS_1528
相关产品推荐
相关产品推荐

