You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:45:26