查看对象的隐藏属性

时间:2019-01-23 09:21:19

标签: javascript node.js javascript-objects

我正在尝试处理node.js中的错误。

运行box.diagonalUp=True会得到:

console.log(error)

但是,如果我尝试运行TypeError: Cannot read property 'id' of undefined at solrClient.search.then.res (/.../schema.js:72:20) at <anonymous> at process._tickCallback (internal/process/next_tick.js:189:7) ,则会得到Object.keys(error)个空数组。对于不同的错误,我确实得到了[]

尝试访问上述错误的属性时,['message', 'code', 'type', 'errno']仍然有效。

尽管隐藏了这些属性,是否有可能获得其名称?

3 个答案:

答案 0 :(得分:1)

TypeError不是数组/映射,是定义明确的异常实例:

如果(例如TypeError实例)

示例:

catch (e) {
    if (e instanceof TypeError) {
      // Output expected TypeErrors.
      //Here try to get the information you need here
      logging.log(e);
    } else {
      // Output unexpected Errors.
      logging.log(e, false);
    }

看一下: https://airbrake.io/blog/nodejs-error-handling/node-typeerror

答案 1 :(得分:1)

Object.keys仅返回自己的可枚举属性。如果不返回任何内容,则意味着message是从原型继承的或不可枚举的,TypeError属性就是后者。

不可枚举的属性可以用Object.getOwnPropertyNames(error)列出。

可以通过遍历原型来检索继承的属性:

let proto = error;

while (proto) {
  console.log(Object.getOwnPropertyNames(proto));
  proto = Object.getPrototypeOf(proto);
}

答案 2 :(得分:0)

可能不是真的,但我认为接下来会有问题...

您正在使用solr-node-client库。该库依赖于bluebird库。 最后一个库创建自己的TypeError类,例如以下代码:

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

并且此代码将消息和名称属性设置为不可枚举。