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

Node.js函数未等待Promise完成问题求助

解决函数未等待Promise完成的问题

问题根源

  1. 中间件未返回有效Promise:中间件的createPlayer是async函数,但内部使用new_Player.save()的回调模式,没有返回异步操作的Promise,且整个函数无任何return结果,导致控制器await的是一个立即resolve为undefined的Promise,根本不会等待数据库存储完成。
  2. 控制器异步语法混用错误:同时使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:18:09