我在node.js控制台脚本中使用pg-promise。
节点版本:v0.10.38 pg-promise版本:1.1.4
由于无关紧要的错误配置问题,我收到了连接错误。但是我希望我的脚本能够通过对问题的丰富解释提醒我。
如果我将错误对象传递给错误处理程序回调并通过console.log()将其“按原样”发送到控制台,那么我可以看到文本“no pg_hba.conf entry for host”127.0.0.1“以标有“输出1”的方式看到。
但是,如果这似乎不是一个有效的JSON对象,我不知道如何访问具有该消息的属性。
此外,如果我在该对象上记录JSON.stringifgy()的结果,那么该信息就会消失。
这是pg-promise实现的错误吗?或者它是某种JSON隐藏属性,可以以任何方式访问?。
以下是该问题的复制品:
源代码:
var pgpLib = require('pg-promise');
var pgp = pgpLib({});
var db = pgp({
host: "localhost",
database: "__db_name__",
user: "__db_user__",
password: "__db_password__",
});
db.query("select 'foo'").then(
function(){
console.log ("Works!!");
},
function(err){
console.log("ERROR!!", err); // (Output 1)
// console.log("ERROR!!", JSON.stringify(err)); // (Output 2)
}
);
输出1:
ERROR!! { [error: no pg_hba.conf entry for host "127.0.0.1", user "reports", database "ruminant", SSL off]
name: 'error',
length: 143,
severity: 'FATAL',
code: '28000',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'auth.c',
line: '493',
routine: 'ClientAuthentication' }
输出2:
ERROR!! {"name":"error","length":143,"severity":"FATAL","code":"28000","file":"auth.c","line":"493","routine":"ClientAuthentication"}
修改:
正如Trott所说(谢谢),我可以通过使用.toString()方法(或强制字符串强制)来获取该字符串。
但是,无论如何,以下输出对我来说似乎不是有效的JSON。
我想通过在对象的原型中重载.toString()方法可以达到同样的效果,但我不能:
var foo = function(){};
Object.defineProperty(foo.prototype, "toString", {
enumerable: false,
value: function() {
return "Some hidden data";
}
});
var bar = new foo();
console.log("1:", bar, bar.toString());
bar.otherStuff = "foobar";
console.log("2:", bar, bar.toString());
输出:
1: {} Some hidden data
2: { otherStuff: 'foobar' } Some hidden data
答案 0 :(得分:2)
要从Error
对象获取错误消息而不使用其他所有内容,请使用.toString()
。
console.log('ERROR! ', err.toString());
如果使用字符串连接,它应该具有相同的效果:
console.log('ERROR! ' + err);
后一种方式似乎是pg-promise README example code处理错误的方式。
我已经使用pg-promise
对它们进行了测试并且它们有效,但是它们打印出“错误:”作为其消息的一部分,因此您不需要包含“错误! “就像我一样。