Node.js函数未等待Promise完成问题求助
解决函数未等待Promise完成的问题
问题根源
- 中间件未返回有效Promise:中间件的
createPlayer是async函数,但内部使用new_Player.save()的回调模式,没有返回异步操作的Promise,且整个函数无任何return结果,导致控制器await的是一个立即resolve为undefined的Promise,根本不会等待数据库存储完成。 - 控制器异步语法混用错误:同时使用
await和.then,且.then(console.log(results))属于错误写法——console.log(results)会立即执行(此时results还是初始空字符串),并未作为回调函数传递给.then。
修复步骤
1. 修复中间件代码
Mongoose的save()方法本身支持Promise,直接用await替代回调,确保函数返回正确的Promise:
export async function createPlayer(req_body) { try { const new_Player = new Player(req_body); // 等待save操作完成,失败会自动抛出错误进入catch await new_Player.save(); console.log(new_Player); return { success: true, body: new_Player }; } catch (error) { log_error('Errored trying to create a player.', error); return { success: 'error', body: 'Error Has Occured. An Admin has been contacted.' }; } };
2. 修复控制器代码
放弃await与.then混用,直接用await获取结果,逻辑更清晰:
export async function createPlayer(req, res) { try { const results = await PlayerFunction.createPlayer(req.body); console.log(results); res.status(200).send(results); } catch (error) { log_error('Errored trying to create Player in controller.', error); res.status(404).send('Error Has Occured. An Admin has been contacted.'); } };
额外注意事项
- 异步流程中不要混用
await和.then/.catch,会导致逻辑混乱,增加调试难度。 - Mongoose所有CRUD操作都原生支持Promise,优先使用async/await语法,比回调模式更易读、易维护。
- async函数必须确保内部有异步操作被
await,或者返回一个Promise,否则会立即resolve,上层代码无法等待异步任务完成。
内容的提问来源于stack exchange,提问作者frank-schroeder
相关产品推荐
相关产品推荐

