2013-03-08 4 views
3

Итак, я реализую findOrCreate в моей пользовательской схеме, которая в основном имеет и имеет массив профилей (каждый пользователь может иметь несколько стратегий входа в систему). Вы можете принять это за задание, если пользователь положительно идентифицирован, имея профиль с соответствующим провайдером и идентификатором к предоставленному профилю, который мы вызываем findOrCreate. Целью findOrCreate является идентификация пользователя, который соответствует предоставленному профилю, или создать нового пользователя, используя предоставленный профиль. Эта функция имеет четыре случая возврата. произошлоnode.js + mongoose UserSchema findOrCreate

  1. Ошибка при запросе пользователя
  2. был найден
  3. Пользователь произошло
  4. Ошибка после неудачной попытки найти пользователя и пытается создать один
  5. Не удалось найти пользователя и успешно создан один

Теперь я считаю, что следующий код делает это. Моя забота и причина в этом вопросе заключается в том, что обратный вызов, переданный в findOne, не возвращается последовательно. Если при запросе для пользователя есть ошибка, мы возвращаем обратный вызов (...), и если мы найдем пользователя, мы возвращаем обратный вызов (...), однако, если нам нужно создать пользователя, мы никогда не возвращаем его явно. Есть ли что-то, что я могу вернуть результат сохранения? Это то, что я должен делать, или это правильно, как у меня?

Код:

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

Этот код выглядит хорошо. В то время как идея Питера по очистке хорошая, то, что у вас здесь, должно по-прежнему работать. – JohnnyHK

ответ

1

Вобще user.save(callback); с момента инлайн анонимной функции есть, по существу, идентично тому, что save уже делает с обратным вызовом. Операторы return являются чисто механизмами управления потоком, единственная цель которых заключается в том, чтобы избежать выполнения последующего кода внутри этой функции, а само фактическое возвращаемое значение полностью игнорируется вызывающим, как это принято в асинхронном программировании в узле. Вы можете закодировать идентичную логику с использованием блоков if/else вместо if/return пунктов охраны и никогда не использовать ключевое слово return и по-прежнему корректно выполнять эту функцию.

Смежные вопросы