loopback PersistedModel find() 错误处理

loopback PersistedModel find() error handling

我正在关注环回框架教程,特别是此页面 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 连接器并遇到了类似的问题。如何正确处理这样的错误?

您还需要检查 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;