Посмотреть скрытое свойство объекта - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь обработать ошибки в 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 ]

0 голосов
/ 23 января 2019

Object.keys возвращает только собственные перечислимые свойства.Если он ничего не возвращает, это означает, что message либо унаследован от прототипа, либо не перечислим, последний относится к TypeError свойствам.

Не перечисляемые свойства могут быть перечислены с Object.getOwnPropertyNames(error).

Унаследованные свойства могут быть получены путем итерации по прототипам:

let proto = error;

while (proto) {
  console.log(Object.getOwnPropertyNames(proto));
  proto = Object.getPrototypeOf(proto);
}
0 голосов
/ 23 января 2019

Может быть, это не так, но я думаю, что проблема в следующем ...

Вы используете библиотеку 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;
}

И этот код устанавливает атрибуты сообщения и имени как не перечисляемые.

0 голосов
/ 23 января 2019

Ошибка TypeError не является массивом / картой, это четко определенный экземпляр исключения:

if (e instanceof 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...