Node.js Node console.log:什么是";堆栈:[Getter]“吗?”;?

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] } 我到底得到了什么,我该如何处理它(获取纯文本消息)?我以前从未见过,它显然不是我想象中的字符串,但它看起来也不像我习惯的对象 编辑:我现在只想传递错误的消息属性,但由于某些原因

我有一个来自soap客户端库的响应,当我
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