node.js+mongoose UserSchema findOrCreate

Posted

技术标签:

【中文标题】node.js+mongoose UserSchema findOrCreate【英文标题】: 【发布时间】:2013-02-23 16:13:38 【问题描述】:

所以,我在我的用户模式上实现findOrCreate,它基本上只有一个配置文件数组(每个用户可以有多个登录策略)。您可以认为用户通过拥有与我们调用findOrCreate 所提供的配置文件匹配的提供者和ID 的配置文件被肯定地识别。 findOrCreate 的目标是识别与提供的配置文件匹配的用户或使用提供的配置文件创建新用户。该函数有四种返回情况。

    查询用户时出错 找到用户 未能找到用户并尝试创建用户后发生错误 找不到用户并成功创建了一个

现在,我相信下面的代码可以做到这一点。我对这个问题的担忧和原因是提供给findOne 的回调不会始终返回。如果在查询用户时出错,我们返回 callback(...) ,如果我们找到用户,我们返回 callback(...) 但是,如果我们需要创建用户,我们永远不会显式返回。有什么方法可以返回保存的结果吗?这甚至是我应该做的还是我的方式正确?

代码:

UserSchema.static('findOrCreate', function (profile, callback) 
    this.findOne( profiles:  $elemMatch:  provider: profile.provider, id: profile.id , function(err, user) 
        if (err)
           return callback(err);

        if (user)
            return callback(null, user);

        user = new User(
            profiles: [profile]
        );
        user.save(function (err, user) 
            if (err)
                return callback(err);

            return callback(null, user);
        );
    );
);

【问题讨论】:

这段代码看起来不错。虽然 Peter 清理它的想法很好,但您在这里应该仍然有效。 【参考方案1】:

只需执行user.save(callback);,因为您的内联匿名函数与save 已经对其回调所做的基本相同。 return 语句是纯粹的流控制机制,其唯一目的是避免在此函数中执行后续代码,并且调用者完全忽略实际返回值本身,这在 node.js 中的异步编程中很常见。您可以使用 if/else 块而不是 if/return 保护子句来编写相同的逻辑,并且根本不使用 return 关键字,并且仍然可以使此函数正常运行。

【讨论】:

以上是关于node.js+mongoose UserSchema findOrCreate的主要内容,如果未能解决你的问题,请参考以下文章

node.js 中间件 mongoose

??? MongoDB ??? Node.js ????????? Mongoose ??

Node.js:如何在 mongoose.js 中执行 count 命令?

如何让 node.js 使用 mongoose 连接到 mongolab

Node.JS + Mongoose 回调地狱

Node.js - 使用 Mongoose 创建关系