猫鼬模型保存后返回承诺

Posted

技术标签:

【中文标题】猫鼬模型保存后返回承诺【英文标题】:Return promise after mongoose model saving 【发布时间】:2021-12-04 15:02:05 【问题描述】:

我正在尝试在猫鼬中保存模型后返回一个承诺。

这是用户文档的架构:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const UserSchema = new mongoose.Schema(
    first_name:String,
    last_name:String,
    phone_number:String,
    email:type:String, unique:true, required:true, lowercase:true,
    account_status: Boolean,
    hash:String,
    salt:String,
);

module.exports = UserSchema;

这是用户模型的代码:


const mongoose = require("mongoose");
const userSchema = require("./UserSchema");
const userModel = new mongoose.model("User", userSchema);
module.exports = userModel;

这是保存用户对象的代码:

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

function UserController()

UserController.prototype.addUser = function(user_datas)
    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)
            /** 
               Some customs code before returning the promise 
            **/

            return new Promise(function(resolve, reject)
                reject(err);
                resolve(null);
            );
        
        
        if(user)

            /** 
               Some customs code before returning the promise 
            **/

            return new Promise(function(resolve, reject)
                resolve(user);
                reject(null);
            );
        
    );


addUser 函数总是返回 undefined 而不是一个 promise。 我想要的是解决 User Object 创建的承诺并在发生错误时拒绝错误。

有什么想法吗?

提前致谢。

【问题讨论】:

【参考方案1】:

将整个 addUser 函数包装在 return new Promise() 中,然后在保存回调 resolve/reject

【讨论】:

【参考方案2】:

在您的代码中发生的情况是,当您返回 Promise 时,这实际上是传递给 new_user.save() 的回调函数的返回值。

如果您希望 addUser 函数返回解析为 User 对象的 Promise,请将 new_user.save() 包装在 Promise 中并返回。

UserController.prototype.addUser = function(user_datas)
    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;

    return new Promise(function(resolve, reject) 
        new_user.save(function(err, user) 
            if (err) 
                reject(err);
             else 
                resolve(user);
            
        );
    );

【讨论】:

以上是关于猫鼬模型保存后返回承诺的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬静态方法返回一个蓝鸟承诺

猫鼬批量保存承诺

Express,第二次调用then()函数,用猫鼬保存对象后返回未定义对象

猫鼬通过承诺返回验证还是我需要实现它?

带有 Q 承诺的 Node.JS 猫鼬请求返回空

使用猫鼬保存对象后,我可以返回具有字段子集的对象的最简单方法是啥?