Итак, я реализую findOrCreate
в моей пользовательской схеме, которая в основном имеет и имеет массив профилей (каждый пользователь может иметь несколько стратегий входа в систему). Вы можете принять это за задание, если пользователь положительно идентифицирован, имея профиль с соответствующим провайдером и идентификатором к предоставленному профилю, который мы вызываем findOrCreate
. Целью findOrCreate
является идентификация пользователя, который соответствует предоставленному профилю, или создать нового пользователя, используя предоставленный профиль. Эта функция имеет четыре случая возврата. произошлоnode.js + mongoose UserSchema findOrCreate
- Ошибка при запросе пользователя был найден
- Пользователь произошло
- Ошибка после неудачной попытки найти пользователя и пытается создать один
- Не удалось найти пользователя и успешно создан один
Теперь я считаю, что следующий код делает это. Моя забота и причина в этом вопросе заключается в том, что обратный вызов, переданный в 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);
});
});
});
Этот код выглядит хорошо. В то время как идея Питера по очистке хорошая, то, что у вас здесь, должно по-прежнему работать. – JohnnyHK