我有一个路由器文件,它处理快递中国家的所有路线,并从模型文件中调用一个函数。
router.get('/:_id', function(req, res, next){
countriesModel.getCountry(req.params._id, function(data, err){
if(err)
{
res.json({status:0, message:"Country Not Found for id : "+req.params._id, errDetails:{err}});
res.end();
}
else
{
res.json(data);
res.end();
}
}); });
这是模型文件中的getCountry函数。
exports.getCountry = function(id, callback){
return db.queryAsync('select * from tbl_countries where ID = '+id)
.then(function(countryRows){
if(countryRows.length){
return Promise.resolve(callback(countryRows));
}
else
{
return Promise.resolve(callback('No Data To Return.'));
}
});
}
当我输入正确的ID时,它工作正常,但是当有人输入错误的ID时,我想推送错误,这在数据库中是不可用的。
请您指导我如何实现这一目标,我是Node& S的新手。表达
我正在使用mySQL和express。
答案 0 :(得分:0)
首先,由于你的数据库已经返回了一个promise,你可以让你的函数在出现错误时返回一个被拒绝的promise。并且,完全停止使用普通回调。您已经有了承诺,让您的来电者使用:
User.find().exec(function(error, groups) {
return res.status(200).send(groups);
});
然后,在路由器中,使用返回的promise:
exports.getCountry = function(id){
return db.queryAsync('select * from tbl_countries where ID = '+id)
.then(function(countryRows){
if(countryRows.length){
// make countryRows be resolved value of the promise
return countryRows;
} else {
// make promise be rejected with this error
throw new Error('Country not found'));
}
});
}
注意:
还有其他原因可以在此处获得被拒绝的承诺(例如某种数据库错误)。当发生这种情况时,您必须决定要在路线中返回什么。现在,它返回找不到所有错误的国家/地区,但其他类型的错误应该返回5xx状态。
没有理由在router.get('/:_id', function(req, res, next){
countriesModel.getCountry(req.params._id).then(data => {
res.json(data);
}).catch(err => {
res.json({status:0, message:"Country Not Found for id : "+req.params._id, errDetails:{err}});
});
});
或res.end()
之后致电res.send()
,因为它会自动为您调用。
永远不要将promises与普通回调混合在一起。如果你已经有一个最低级别的承诺,只需使用它,不要用简单的回调覆盖它。