模型和路径之间的快速错误处理

时间:2018-02-20 15:07:27

标签: node.js express

我有一个路由器文件,它处理快递中国家的所有路线,并从模型文件中调用一个函数。

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。

1 个答案:

答案 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'));
        }
    });
}

注意:

  1. 还有其他原因可以在此处获得被拒绝的承诺(例如某种数据库错误)。当发生这种情况时,您必须决定要在路线中返回什么。现在,它返回找不到所有错误的国家/地区,但其他类型的错误应该返回5xx状态。

  2. 没有理由在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(),因为它会自动为您调用。

  3. 永远不要将promises与普通回调混合在一起。如果你已经有一个最低级别的承诺,只需使用它,不要用简单的回调覆盖它。