在我的控制器中,我有一个调用另一个函数的终点函数,期望得到一个结果或者从被调用的函数中捕获错误。
exports.createInvites = (req, res) => {
// code...
try {
generateInvitations(requirements, data => {
res.status(200).json({data});
});
} catch (err) {
console.log(`caught the error: ${err}`);
return res.status(500).json(err);
}
}
在被调用函数generateInvites
中,我使用mongoose将生成的对象保存到mongodb,如果有则抛出错误。
function generateInvitations(requirements, cb) {
const { expirationDate, credits, numOfUse, numOfInvites } = requirements;
let invitationCodes = [];
for (let i = 0; i < numOfInvites; i++) {
const code = randomString(CODE_LENGTH);
invitationCodes.push(code);
const invitation = new Invitation({
// code,
numOfUse,
expirationDate,
credits
});
invitation.save((err, obj) => {
if (err) {
throw err; // it should throw a ValidationError here
}
});
}
cb(invitationCodes);
}
以上代码是我尝试处理generateInvites
中引发的错误。当然,我没有发现任何错误。我做错了什么?我该怎么做呢?
答案 0 :(得分:1)
你需要处理这样一个事实,即回调将在抛出错误之前很长时间内发生,因为它是在它自己的回调中。我建议Promise.all等待所有返回promises的保存操作。
function generateInvitations(requirements) {
const { expirationDate, credits, numOfUse, numOfInvites } = requirements;
let promises = [];
for (let i = 0; i < numOfInvites; i++) {
const code = randomString(CODE_LENGTH);
const invitation = new Invitation({
// code,
numOfUse,
expirationDate,
credits
});
promises.push(invitation.save());
}
return Promise.all(promises):
}
然后:
generateInvitations(requirements)
.then(data => res.status(200).json({data}))
.catch(err => {
console.log(`caught the error: ${err}`);
return res.status(500).json(err);
});