Node.js:如何返回UUID同时异步执行SQL长任务?
解决方案
核心思路是不等待SQL执行完成,直接生成UUID并返回,同时让SQL任务在后台异步执行,还要将UUID和SQL任务的状态/结果关联起来,方便后续查询。
1. 调整函数逻辑,异步执行SQL任务
修改getUUID函数,去掉await阻塞,直接启动SQL任务后台运行,同时立即生成并返回UUID:
// 存储UUID对应的任务状态与结果,生产环境建议用Redis或数据库替代内存存储 const taskStore = new Map(); async getUUID() { const uuid = uuidv4(); // 初始化任务状态为执行中 taskStore.set(uuid, { status: 'running', result: null }); // 不等待SQL执行完成,直接启动异步任务 executeSql(uuid).catch(err => { // 捕获SQL执行错误,更新任务状态 taskStore.set(uuid, { status: 'failed', error: err.message }); }); return uuid; } async executeSql(uuid) { try { // 执行SQL查询逻辑 const sqlResult = /* 实际SQL执行结果 */; // SQL执行完成后,更新任务状态与结果 taskStore.set(uuid, { status: 'completed', result: sqlResult }); } catch (err) { throw err; } }
2. 新增结果查询接口
提供接口让用户通过UUID查询任务状态和最终结果:
async getTaskResult(uuid) { const task = taskStore.get(uuid); if (!task) { return { status: 'not_found' }; } return task; }
关键注意点
- 移除
await后,getUUID不会再等待SQL执行,能立即返回UUID给用户。 - 必须维护UUID与任务状态的映射,否则后续无法关联查询结果;生产环境不要用内存存储,避免服务重启丢失数据。
- 要捕获SQL执行的异常,及时更新任务状态为失败,避免任务一直处于"running"状态。
内容的提问来源于stack exchange,提问作者boomchickawawa
相关产品推荐
相关产品推荐

