3

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

  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その唯一の目的はこの関数内の後続のコードの実行を回避することであり、実際の戻り値自体は呼び出し元によって完全に無視されます。ノードでの非同期プログラミングでは通例です。ガード句if/elseの代わりにブロックを使用して同一のロジックをコーディングし、キーワードをまったく使用しないで、この関数を正しく動作させることができます。if/returnreturn

于 2013-03-08T08:01:39.057 に答える