node.js + mongoose UserSchema findOrCreate

时间:2013-03-08 07:05:50

标签: node.js mongoose passport.js

所以,我正在我的User模式上实现findOrCreate,它基本上只有一些配置文件(每个用户可以有多个登录策略)。您可以将其视为通过将配置文件与匹配的提供程序和ID配置为我们正在调用findOrCreate的配置文件进行肯定识别的给定。 findOrCreate的目标是识别与提供的配置文件匹配的用户,或使用提供的配置文件创建新用户。此函数有四个返回案例。

  1. 查询用户时出错
  2. 找到了用户
  3. 找不到用户并尝试创建一个
  4. 后发生错误
  5. 无法找到用户并成功创建了一个
  6. 现在,我相信以下代码可以做到这一点。我对这个问题的关注和原因是提供给findOne的回调不会一直返回。如果在查询用户时出错,我们返回回调(...),如果找到用户,我们返回回调(...)但是,如果我们需要创建用户,我们永远不会显式返回。有什么事我可以返回保存的结果吗?这甚至是我应该做的还是我的方式是正确的?

    代码:

    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);
            });
        });
    });
    

1 个答案:

答案 0 :(得分:1)

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