loopback PersistedModel find()错误处理

时间:2016-07-12 13:13:53

标签: node.js error-handling loopbackjs

我正在关注环回框架教程,特别是这个页面 https://docs.strongloop.com/display/public/LB/Extend+your+API 有一个示例代码通过ID查找实例,我修改了一下来处理不存在的实例

Coffeeshop.getName=function(id, cb)
{
    Coffeeshop.findById(id, function(err, shop){
        if(err)
        {
            console.log(err);
            cb(err);
        }
        else                
            cb(null, 'Name of the coffee shop is '+shop.name);
    });
};

当我使用现有ID调用它时一切正常,但是当我输入一个无效的ID,而不是完全省略err处理程序时,会调用else语句并且整个应用程序崩溃并出现以下控制台错误

/app/path/here/node_modules/mysql/lib/protocol/Parser.js:78
throw err; // Rethrow non-MySQL errors

我是node.js的新手,我很确定我在这里遗漏了一些东西但是不应该将错误传递给回调函数而不是被抛到顶端水平?

这似乎不是mysql后端特定的,我切换到mongo连接器并遇到了类似的问题。如何妥善处理这样的错误?

1 个答案:

答案 0 :(得分:1)

您还需要检查shop参数。完整的检查将是这样的:

Coffeeshop.getName=function(id, cb)
{
    Coffeeshop.findById(id, function(err, shop){
        if(err)
        {
            console.log(err);
            cb(err);
        }
        else
        {
          if(shop) {
            cb(null, 'Name of the coffee shop is '+shop.name);
          } else {
            var error = new Error();
            error.message = 'Coffee Shop is not found.';
            error.statusCode = 404;
            cb(error);
          }
        }           

    });
};

这是loopback用于其内置模型的模式。代码来自文件node_modules/loopback/common/models/user.js,大约为281行号。

User.logout = function(tokenId, fn) {
fn = fn || utils.createPromiseCallback();
this.relations.accessTokens.modelTo.findById(tokenId, function(err, accessToken) {
  if (err) {
    fn(err);
  } else if (accessToken) {
    accessToken.destroy(fn);
  } else {
    fn(new Error('could not find accessToken'));
  }
});
return fn.promise;