Node / Express& Postgresql - 没有行匹配时

时间:2016-10-04 02:47:52

标签: node.js postgresql pg-promise

您好我是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'"
}

2 个答案:

答案 0 :(得分:3)

我是pg-promise的作者。

在承诺领域,我使用.then来处理所有正常情况,.catch来处理所有错误情况。

转换为符合该规则的pg-promise,您执行的数据库方法会解析代表所有正常情况的结果,因此其他任何内容都会以.catch结尾。

例如,如果返回一行或没有行是您查询的正常情况,则应使用方法oneOrNone。只有当返回没有行是无效情况时,才会使用方法one

根据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;
        }
    });

选择方法many vs manyOrNone时会有类似的注意事项(方法anymanyOrNone的较短别名)。

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

答案 1 :(得分: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);
      });