したがって、findOrCreate
基本的にプロファイルの配列だけを持つ User スキーマに実装しています (各ユーザーは複数のログイン戦略を持つことができます)。提供されたプロファイルと一致するプロバイダーと ID を持つプロファイルを持つことで、ユーザーが確実に識別されると考えることができますfindOrCreate
。の目的はfindOrCreate
、提供されたプロファイルに一致するユーザーを識別するか、提供されたプロファイルを使用して新しいユーザーを作成することです。この関数には 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);
});
});
});