代码之家  ›  专栏  ›  技术社区  ›  U Rogel

查看对象的隐藏属性

  •  1
  • U Rogel  · 技术社区  · 7 年前

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

    当我奔跑 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'] .

    当试图访问上述写入错误的属性时, error.message 仍然有效。

    尽管这些属性被隐藏,是否有可能获取它们的名称?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Estus Flask    7 年前

    Object.keys 只返回自己的可枚举属性。如果它什么也不返回,这意味着 message 要么是从原型继承的,要么是不可枚举的,后者是 TypeError 性质。

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

    可以通过迭代原型来检索继承的属性:

    let proto = error;
    
    while (proto) {
      console.log(Object.getOwnPropertyNames(proto));
      proto = Object.getPrototypeOf(proto);
    }
    
        2
  •  1
  •   Vitorlui    7 年前

    类型错误不是数组/映射,是一个定义良好的异常实例:

    if(e类型错误实例)

    例子:

    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

        3
  •  0
  •   Yaroslav Gaponov    7 年前

    也许这不是真的,但我认为接下来的问题…

    您使用的是solr节点客户端库。这个图书馆依靠蓝鸟图书馆。 最后一个库创建自己的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;
    }
    

    这段代码将消息和名称属性设置为不可枚举。

    推荐文章