Node.js + Mongoose 用户模式查找或创建。

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

1
这段代码看起来很好。虽然Peter清理它的想法是一个好主意,但你现在所拥有的应该仍然可以工作。 - JohnnyHK
1个回答

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接