我可以让 model.save() 有一个返回值吗?

Posted

技术标签:

【中文标题】我可以让 model.save() 有一个返回值吗?【英文标题】:Can i get model.save() to have a return value? 【发布时间】:2017-05-21 12:51:34 【问题描述】:

我是 node 新手,我正在尝试通过 mongoose 将一些东西保存到 mongo。 如果 save 有错误,我想返回 false(例如,有一个具有当前名称的用户)。 问题是 console.logs 1:2:6:7:3:4:5 的顺序 有什么方法可以同步调用 adduser 吗?

module.exports.addUser = function(username,password)
console.log(1);
var newUser = User(
    username:username,
    password:password
);
console.log(2);
 newUser.save(function(err,prod,numeffect)
    if (err)

        console.log(err);
    
    if (numeffect === 1)
        console.log(3);
         console.log("num effect = "+numeffect);

    
    console.log(4);
    console.log(prod);

).then(function(doc)console.log(5));
console.log(6);


mongoose.addUser(req.body.username,req.body.password);
    console.log(7);

【问题讨论】:

【参考方案1】:

你不应该不要同步,否则你会阻塞你的整个Node线程。

相反,您应该做的是返回一个承诺,或者一个带有回调的简单函数。 (比如mongoose saving one,注意mongoose 两者都支持)

你可以return newUser.save()

然后你会像addUser.then() 一样运行它。此外,您可以删除 module.exports = function() 并使用 callbackpromise 执行 module.exports 函数。

【讨论】:

【参考方案2】:

NodeJs 是单线程进程,你不应该用同步调用阻塞它。

当您收到来自 mongodb 的响应时,您应该传递一个回调函数来执行任何操作。

当进入 NodeJs 时,这是从调用和阻塞到回调的重大转变。

【讨论】:

以上是关于我可以让 model.save() 有一个返回值吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果函数返回多种类型,我可以声明一个函数返回值吗? [复制]

可以在 C++11 中检索线程函数的返回值吗?

ORACLE 创建的函数 可以返回两个值吗,该怎么做?

在Eclipse中调试时,我可以在返回之前找出返回值吗?

使用 REST 代理访问 Ext.data.Model.save() 回调中的 HTTP 响应

在 Visual Studio 中调试时,我可以在返回之前找出返回值吗?