Я использую mongoose
и express
в node
.
Я столкнулся с проблемой с вложенным обещанием и не могу понять, почему это происходит.
Маршрут - / займы
router.post('/problems/add', (req, res, next) => {
// error checking
req.headers.api = 'true';
let required = ['loan', 'item', 'type', 'quantity', 'description'];
let problems = [];
required.forEach(r => {
if (!req.body[r]){
problems.push(`Field '${r}' was not supplied`);
}
});
if (problems.length > 0){
res.json({success: false, message: `Couldn't create problem:\n${problems.join('\n')}`});
} else {
// Important part
loanController.addProblem(req.body)
.then((newProblem) => { // line 118 mentioned in error message
res.json({success: true, problem: newProblem});
})
.catch(err => {
return next(err);
})
}
});
Контроллер - loanController
exports.addProblem = (body) => {
Loan.findById(mongoose.Types.ObjectId(body.loan)).exec()
.then(foundLoan => {
if (!foundLoan){
throw new Error('loan not found');
}
let newProblem = new Problem({
loan: foundLoan._id,
item: mongoose.Types.ObjectId(body.item),
type: body.type,
quantity: body.quantity,
status: 'new',
text: body.description
});
return newProblem.save(); // newProblem is a valid mongoose document
})
.catch(err => {
return Promise.reject(err);
});
}
Я получаю сообщение об ошибке ниже, оно не попадает любым из этих блоков перехвата и исходит из моего общего сообщения об ошибке:
"Ошибка типа: невозможно прочитать свойство then" неопределенного в router.post (c: \ dev .... \ loan. js: 118: 5)
Теперь, когда я устанавливаю точку останова на newProblem.save()
, она показывает, что newProblem
является действительным документом Mon goose, эти документы сохраняются правильно. Я даже могу вызвать newProblem.save().then()
из командной строки отладки.
Я предполагаю, что где-то допустил ошибку, но она структурирована аналогично другим объектам, и они работают нормально.
Может кто-нибудь заметить сделанную мной ошибку или предложить способ дальнейшего расследования?