Я ищу совет о том, как связывать обещания «найти или создать» с помощью mongodb/mongoose.Mongoose - chaining promises
В настоящее время я пробовал:
userSchema.statics.findByFacebookIdOrCreate = function (facebookId, name, email) {
var self = this;
return this.findOne({facebookId: facebookId }).exec()
.then(function (user) {
if (!user) {
return self.model.create({ facebookId: facebookId, name: name, email: email }).exec().then(function (user) {
return user;
});
}
return user;
});
};
И я называю это из моего (узел/экспресс) API конечной точки:
User.model.findByFacebookIdOrCreate(fbRes.id, fbRes.name, fbRes.email).then(function (user) {
return res.sendStatus(200).send(createTokenForUser(user));
}, function (err) {
return res.sendStatus(500).send({ error: err });
});
Проблемы, хотя:
- Несмотря на то, пользователь имеет значение null из запроса findOne, создание никогда не называется
- I'm n ВЗ, что я буду использовать правильный стиль Обещания/наиболее эффективный стиль кодирования
- ли я обработку ошибок правильно, например, только на верхнем уровне или сделать мне нужно сделать это на каждом уровне
Может кто-нибудь увидеть, что я «Я делаю неправильно, и как я мог бы сделать это лучше?
Спасибо.
UPDATE
Причина проблемы заключалась в том, что
self.model.create(...)
должно быть (модель не ссылка)
self.create(...)
Однако, теперь мне нужно знать, что я я ошибаюсь в обработке ошибок - я мог видеть, что произошла ошибка, но я не мог понять причину.
Я до сих пор есть некоторые ошибки, возникающие, которые я знаю, потому что я получаю статус 500
return res.sendStatus(500).send({ error: err });
но фактическое сообщение об ошибке/деталь пуста.
1. Попробуйте 'return self.model.create (...' 2. При сборе обещаний всегда возвращайте либо новое обещание, либо окончательное значение. 3. Наличие единственной функции ошибки в конце просто отлично – Ivancho
Спасибо, я действительно получил это возвращение, но это не помогло. Только вытащил его, чтобы увидеть эффект. – prule
Я отредактировал вопрос, чтобы вернуть обратно. Любые другие идеи? – prule