您好,我是 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 (方法 any 是 manyOrNone 的较短别名)。
输入 QueryResultError有一个非常友好的控制台输出,就像库中的所有其他类型一样,让您很好地了解如何处理这种情况。
关于node.js - Node/Express & Postgresql - 当没有行匹配时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39843398/