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

Mongoose保存model后如何返回Promise 解决addUser返回undefined问题

问题根源
  1. 你当前的写法将Promise的返回语句放在了save()方法的回调函数内部,回调函数的返回值不会向外传递给外层的addUser函数,因此addUser没有指定返回值,默认返回undefined。
  2. 定义User Model的代码存在冗余写法:new mongoose.model("User", userSchema)不需要加new关键字,mongoose.model()直接返回模型构造函数,修正后的Model代码如下:
const mongoose = require("mongoose");
const userSchema = require("./UserSchema");
const userModel = mongoose.model("User", userSchema);
module.exports = userModel;
修复方案

方案1:手动封装Promise(兼容你需要在返回前插入自定义处理逻辑的需求)

将整个保存逻辑包裹在手动创建的Promise中,在回调内部直接触发resolve或reject即可,不需要在回调里返回Promise:

const UserModel = require("../models/user/UserModel");

function UserController(){}

UserController.prototype.addUser = function(user_datas){
    // 直接在addUser顶层返回Promise
    return new Promise((resolve, reject) => {
        var new_user = new UserModel();
        new_user.first_name = user_datas.first_name;
        new_user.last_name = user_datas.last_name;
        new_user.phone_number = user_datas.phone_number;
        new_user.email = user_datas.email;
        new_user.account_status = false;
        new_user.hash = user_datas.hash;
        
        new_user.save(function(err, user){
            if(err){
                /** 
                   此处插入自定义错误处理代码 
                **/
                reject(err);
                return;
            }
            /** 
               此处插入自定义成功处理代码 
            **/
            resolve(user);
        });
    })
}

方案2:直接使用Mongoose原生Promise支持(更简洁)

Mongoose的所有模型操作方法默认返回Promise,不需要手动封装回调,写法更精简:

UserController.prototype.addUser = async function(user_datas){
    const new_user = new UserModel({
        ...user_datas,
        account_status: false
    });
    try {
        const savedUser = await new_user.save();
        /** 
           此处插入自定义成功处理代码 
        **/
        return savedUser;
    } catch (err) {
        /** 
           此处插入自定义错误处理代码 
        **/
        throw err;
    }
}

两种方案调用方式一致,都可以用.then().catch()或者await接收返回结果:

// 调用示例
const controller = new UserController();
controller.addUser(userData)
    .then(user => console.log('保存成功', user))
    .catch(err => console.log('保存失败', err))

内容的提问来源于stack exchange,提问作者the smart life

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:24:03