Mongoose保存model后如何返回Promise 解决addUser返回undefined问题
问题根源
- 你当前的写法将
Promise的返回语句放在了save()方法的回调函数内部,回调函数的返回值不会向外传递给外层的addUser函数,因此addUser没有指定返回值,默认返回undefined。 - 定义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
相关产品推荐
相关产品推荐

