0

したがって、 User オブジェクトが既存のレコードをチェックするためのこのメソッドがあります。

User.findOrCreate = function(json){
    User.findOne({'email' : json.email}, function(err, user){
        if (!user){
            user = new User({
                id: json.id,
                email: json.email,
                f_name: json.first_name,
                l_name: json.last_name,
                gender: json.gender,
                locale: json.locale
            });
            user.save(function(err){
                if (err) return handleError(err);
                return user;
            });
        } else {
            return user;
        }
    });
}

基本的に、変数「user」をfindOrCreateメソッドに戻したいので、次のように別の場所で使用できます。

var user = User.findOrCreate(profile._json);

しかし、代わりに、ログアウトすると user = undefined になります。これにはいろいろと困ります。誰でも助けることができますか?

4

2 に答える 2

0

関数にはステートメントUser.getOrCreateがないため、もちろん戻ります。実際には非同期で動作しているため、関数も非同期である必要があります。したがって、関数定義を次のように変更できます。returnundefinedfindOnegetOrCreate

User.findOrCreate = function(json, callback) {

代わりにreturn user;、コールバック関数を実行する必要があります。

callback(user);
于 2013-05-25T18:48:24.430 に答える
0

あなたはこれを行うことはできません:

var user = User.findOrCreate(profile._json);

の実行User.findOneは非同期なので、findOrCreate戻ったときはUser.findOneまだ実行されていない可能性があります。

ユーザー値を取得する正しい方法は、 で別のコールバックを使用することですfindOrCreate

User.findOrCreate = function(json, callback){
    User.findOne({'email' : json.email}, function(err, user){
       if (!user){
           user = new User({
               id: json.id,
               email: json.email,
               f_name: json.first_name,
               l_name: json.last_name,
               gender: json.gender,
               locale: json.locale
            });
            user.save(function(err){
               if (err) return handleError(err);
               callback(user);
            });
        } else {
            callback(user);
        }
     });
};

ご覧のとおり、これらのコールバックをすべて処理すると気が狂いそうになります。Promise をまだ試していない場合は、Q ライブラリを参照してください: http://documentup.com/kriskowal/q/

それはあなたの人生を楽にします:

 var userPromise = User.findOrCreate(profile._json);
 /* then when you need a user */
 userPromise.done(function (user) { /* do something */ });

利点は、プロミスには非同期コードの制御フローを処理するための非常に便利な抽象化が付属していることです。たとえば、次のfindOrCreateように書くことができるプロミスを使用します。

  User.findOrCreate = function(json) {
       return User.findOne({email:json.email}).then(createIfNull);
  };

ブロックcreateIfNull内にあるコードはどこにありますか ( promise も返す場合は簡単です。そうでない場合は、作成して返すことができます。Q の例を参照してください... ドキュメントはあまり直感的ではありませんが、慣れればすべてのコールバックの混乱が本当に単純化されていることがわかります)。ifsave

于 2013-05-25T20:08:14.027 に答える