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

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

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

现在,我相信下面的代码可以做到这一点。我对这个问题的担忧和原因是提供给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 清理它的想法很好,但您在这里应该仍然有效。

标签: node.js mongoose passport.js


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 2017-03-16
    • 2011-08-14
    • 2017-04-25
    • 2014-11-19
    • 2018-01-30
    • 2018-06-21
    • 2012-08-08
    • 2018-03-07
    相关资源
    最近更新 更多