3

所以,我findOrCreate在我的用户模式上实现,它基本上只有一个配置文件数组(每个用户可以有多个登录策略)。您可以将其视为通过拥有与我们正在调用的提供的配置文件匹配的提供者和 ID 的配置文件来肯定地识别用户findOrCreate。的目标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);
        });
    });
});
4

1 回答 1

1

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

于 2013-03-08T08:01:39.057 回答