【发布时间】: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 清理它的想法很好,但您在这里应该仍然有效。
标签: node.js mongoose passport.js