Node.js Node console.log:什么是";堆栈:[Getter]“吗?”;?
我有一个来自soap客户端库的响应,当我Node.js Node console.log:什么是";堆栈:[Getter]“吗?”;?,node.js,console.log,Node.js,Console.log,我有一个来自soap客户端库的响应,当我console.log它时,我只得到“实际的错误消息”;所以我想可能是一根绳子。但是,当我使用util.inspect记录它时,它向我显示它实际上是一个对象,更具体地说是: { [Error: The actual error message] stack: [Getter] } 我到底得到了什么,我该如何处理它(获取纯文本消息)?我以前从未见过,它显然不是我想象中的字符串,但它看起来也不像我习惯的对象 编辑:我现在只想传递错误的消息属性,但由于某些原因
console.log
它时,我只得到“实际的错误消息”;所以我想可能是一根绳子。但是,当我使用util.inspect
记录它时,它向我显示它实际上是一个对象,更具体地说是:
{ [Error: The actual error message] stack: [Getter] }
我到底得到了什么,我该如何处理它(获取纯文本消息)?我以前从未见过,它显然不是我想象中的字符串,但它看起来也不像我习惯的对象
编辑:我现在只想传递错误的消息
属性,但由于某些原因,这是不可能的:我只能在catch
块中访问它
这是我返回错误的地方:
// Please note that I've just converted this code from coffeescript
// (and changed it a bit) and most stuff is missing (client is actually defined for example)..
// But the relevant code to understand what's going on is still in here
Shipping.book = function (information, callback) {
client.BookQuote(information, function (err, res) {
var processingError = res.BookQuoteResult.ProcessingError;
var orderLogString = res.BookQuoteResult.OrderLog.string;
if (!!processingError && !!orderLogString)
console.log(orderLogString[0].message) // Doesn't log anything
callback(orderLogString[0])
}
}
Shipping.bookSync = function (information) {
var book;
book = Meteor.wrapAsync(Shipping.book);
return book(information);
};
这就是我调用函数的地方:
var err;
try {
return Shipping.bookSync(information);
} catch (_error) {
err = _error;
console.log(err.message); # Logs the plain text error message
}
// ---
// generated by coffee-script 1.9.2
Error
实例的stack
属性用作getter,因为生成堆栈跟踪并不便宜。因此,通过使其成为getter,它只能在需要/请求时惰性地创建堆栈跟踪util.inspect()
只检查属性,不激活getter/函数/其他特殊类型
如果只想从Error
实例中获取消息,可以使用Error.message
获取文本部分
最后,您可以始终使用
typeof foo===“string”
检查变量的类型,或者通过foo instanceof Error
显式检查错误,该对象上有一个节点不期望的额外属性:
╭« cdrost@xanadu:~ »
╰→ node
> function id(x) { return x; }
undefined
> id.stuff = [1,2,3]
[ 1, 2, 3 ]
> id
{ [Function: id] stuff: [ 1, 2, 3 ] }
因此,您正在使用的库正在向您提供一个Error
对象(即,由某个函数Error(…){…}
表达式构造的对象),该对象具有名为stack
的额外意外属性,该属性是Getter
对象的列表(由Getter
命名函数构造)。在本例中,列表似乎只有一个Getter
编辑:要从catch
块导出消息,只需存储消息即可。这是一个有点棘手的问题,因为JS的某些属性有点技术性。例如,一个catch
块根据规范提供了一个新的词汇环境,但您只能将其用于error参数,因为任何var
语句都被提升到最近的函数范围,在catch
块之外
设置err=\u error
确实会将错误从catch
块中清除。但是,JavaScript允许您抛出几乎任何东西,包括抛出仍然具有外部引用的对象:
function trickyError(msg) {
var err = new Error(msg)
setTimeout(function () {
delete err.message;
}, 1);
throw err;
}
function example() {
try {
trickyError("Something insane happened.");
} catch (e) {
// This logs the message properly because JS is single-threaded:
console.log(e.message);
// This usually logs `undefined`, but could maybe in some high-load
// circumstances log the message properly, if the OS neglects the Node
// thread for 100ms and the Node setTimeout scheduler doesn't respect
// their temporal order when handling the two events -- I'm not sure
// that any standards say that they have to happen in order.
setTimeout(function () {
console.log(e.message);
}, 100);
}
}
要解决此问题,请不要存储err=\u error
,而是存储err=\u error.message
。由于JS字符串是不可变的,因此其他代码段是否引用了错误消息并不重要。当您遇到错误实例时,通常可以执行console.log(error.stack)
来获取堆栈跟踪,以便找出错误抛出的位置。不太清楚为什么您的console.log输出中会包含该错误。使用error.message
仅在我的catch
块中有效,但由于某种原因,我不会在返回错误的位置工作。如果您遇到此问题,也许您应该在问题中展开一点,显示更多的代码和您在catch
块中看到的内容,与接收到相同返回错误对象的位置相比。但是是否可以只返回我注释的错误字符串“//不记录任何内容”?这会更好,因为我在其他任何地方都返回字符串,tooYes,returne.message
是JavaScript中的有效语句,e
是具有属性的某种类型的对象;这包括一个catch(e){…}
块,除非你开始做一些疯狂但有效的事情,比如抛出null代码>