node.js - Node/Express & Postgresql - 当没有行匹配时

标签 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'"
}

最佳答案

我是 pg-promise 的作者.


在 promises 领域,使用 .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对比manyOrNone (方法 anymanyOrNone 的较短别名)。

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

关于node.js - Node/Express & Postgresql - 当没有行匹配时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39843398/

相关文章:

node.js - 从服务器的 header 中获取 header token

javascript - JS/Node.js 如何获取这种格式的日期/时间 : 2017-03-13T04:43:30. 916Z

javascript - pg-promise,使用带有嵌套对象的命名参数

node.js - 如何在交易中使用其他仓库

javascript - SequelizeEagerLoading错误: parent model is not associated to child

javascript - 获取javascript时Node.js HTML页面错误404

java - PredictionIO:在 OSX 上为 postgresql 安装 JDBC 驱动程序

node.js - 如何在 PostgreSQL GEOMETRY 字段上创建空间索引?

ruby-on-rails - Ruby - 通过嵌套属性选择属于两个数组的项目的最快方法

postgresql - 在带有 pg-promise 查询的模板文字上使用 $1 有好处吗?