2

您好,我是 Postgresql 的新手,我想了解如何在抛出错误时处理 0 结果。本质上,如果用户不存在,我想获取用户,如果不存在则返回 null,并有一个错误处理程序。以下是我正在使用的当前代码。任何有关更好方法的提示都值得赞赏!

var options = {
  // Initialization Options
  promiseLib: promise
};
var pgp = require('pg-promise')(options);
var connectionString = 'postgres://localhost:5432/myDbName';
var db = pgp(connectionString);

function getUser(id) {         
  let user = new Promise(function(resolve, reject) {
    try {
      db.one('select * from users where loginName = $1', id).then(function(data) {
        console.log(data);
        resolve(data); 
      }).catch (function (e) {
        console.log('error: '+e);
        reject(e);
      });
    }
    catch (e) {
      console.log('error: '+e);
      reject(e);
    }
  });
  return user;
}

控制台输出:

error: QueryResultError {
    code: queryResultErrorCode.noData
    message: "No data returned from the query."
    received: 0
    query: "select * from users where loginName = 'someUserName'"
}
4

2 回答 2

9

我是pg-promise的作者。


在 Promise 领域,人们使用它.then来处理所有正常情况和.catch处理所有错误情况。

转换为遵守该规则的 pg-promise,您执行一个数据库方法,该方法使用代表所有正常情况的结果进行解析,因此其他任何事情都以.catch.

举个例子,如果返回一行或不返回行是您查询的正常情况,您应该使用方法oneOrNone。只有当不返回任何行是无效的情况时,您才会使用方法

根据 API,方法oneOrNone解析找到的数据行,或者null当没有找到行时,您可以检查:

db.oneOrNone('select * from users where loginName = $1', id)
    .then(user=> {
        if (user) {
            // user found
        } else {
            // user not found
        }
    })
    .catch(error=> {
        // something went wrong;     
    });

但是,如果您有一个不返回任何数据的查询确实表示错误,则检查是否不返回任何行的正确方法是这样的:

var QRE = pgp.errors.QueryResultError;
var qrec = pgp.errors.queryResultErrorCode;

db.one('select * from users where loginName = $1', id)
    .then(user=> {
        // normal situation;
    })
    .catch(error=> {
        if (error instanceof QRE && error.code === qrec.noData) {
            // found no row
        } else {
            // something else is wrong;
        }
    });

在选择方法manymanyOrNone时会考虑类似的考虑(方法anymanyOrNone的更短别名)。

QueryResultError类型有一个非常友好的控制台输出,就像库中的所有其他类型一样,可以让您很好地了解如何处理这种情况。

于 2016-10-04T08:16:12.007 回答
1

在查询的 catch 处理程序中,只需测试该错误。查看pg-promise源代码,noData 的代码为 0。所以只需执行以下操作:

db.one('select * from users where loginName = $1', id).then(function(data) {
        console.log(data);
        resolve(data); 
      }).catch (function (e) {
        if(e.code === 0){
          resolve(null);
        }
        console.log('error: '+e);
        reject(e);
      });
于 2016-10-04T03:07:37.527 回答