Как получить свойство из объекта JavaScript, который появляется только в console.log (), но не в JSON.stringify ()?

1

Я получаю объект ошибки из моей базы данных SQLite. Когда я отображаю его с console.log(err), я получаю:

{records: {Ошибка: SQLITE_ERROR: такой таблицы нет: showcaseUsers errno: 1, код: 'SQLITE_ERROR'}}

Тем не менее, когда я отображаю его с помощью JSON.stringify(err), я получаю только:

{ "записи": { "ERRNO": 1, "код": "SQLITE_ERROR"}}

Я хочу получить сообщение об ошибке no such table: showcaseUsers в строке.

Единственный способ, которым я нашел, как это сделать, это:

const errorText = console.log(data);

Но это также выводит данные на консоль, что нежелательно.

Как я могу (1) остановить console.log от вывода его содержимого на консоль или иначе (2) получить сообщение об ошибке в строке другим способом?

ПРИМЕЧАНИЕ. На данный момент я нахожусь в Node, а не в браузере, так что не похоже, что ответ в Capturing javascript console.log? полезно

  • 0
    Возможный дубликат захвата javascript console.log?
  • 1
    «Я нашел единственный способ сделать это с помощью этого: const errorText = console.log (data);» удалить console.log? const errorText=data;
Показать ещё 8 комментариев
Теги:
console.log

3 ответа

1
Лучший ответ

Нет необходимости перехватывать console вообще - вы найдете все сообщение об ошибке в err.message, хотя префикс " SQLITE_ERROR: " по-прежнему префикс SQLITE_ERROR:

Это не перечисляемое свойство объекта Error поэтому оно не отображается в выводе JSON:

let sqlite3 = require('sqlite3');

let db = new sqlite3.Database(':memory:');
db.run("UPDATE foo SET bar = 1", (err, res) => {
  console.log(Object.getOwnPropertyDescriptors(err));
  console.log(err.message);
});

с выходом:

{ stack:
   { value: 'Error: SQLITE_ERROR: no such table: foo',
     writable: true,
     enumerable: false,
     configurable: true },
  message:
   { value: 'SQLITE_ERROR: no such table: foo',
     writable: true,
     enumerable: false,        <<---------
     configurable: true },
  errno:
   { value: 1, writable: true, enumerable: true, configurable: true },
  code:
   { value: 'SQLITE_ERROR',
     writable: true,
     enumerable: true,
     configurable: true } }
SQLITE_ERROR: no such table: foo
-1

Если это возможно, вы можете попытаться перехватить console.log следующим образом:

if(window.console){
  console.yo = console.log;
  console.log = function(str){ // notice that you can use str for further use
    // console.yo('Welcome!!'); // just comment out if you don't need the console
    document.getElementById('console').innerHTML=str; // notice that you can use str for further use
  }
}
console.log('Error!! My stomach is empty!!');
<span id="console"></span>
-2

Проблема в неправильном формате JSON, который должен быть парами key:value. Если value в key:value является строкой, то оно должно быть заключено в одинарные или двойные кавычки.

{records: {Ошибка: SQLITE_ERROR: такой таблицы нет: showcaseUsers errno: 1, код: 'SQLITE_ERROR'}}

При отсутствии правильного value (value в вашем случае имеет тип данных String), JSON.stringify(err) пытается привести его к JSON на основе двоеточия : качестве разделителя между key и value. Доступные типы данных в JavaScript

Вот исправление, я только что заключил его в двойные кавычки и отформатировал (форматирование необязательно, полезно для разборчивости).

{ 
    records: { 
        Error: "SQLITE_ERROR: no such table: showcaseUsers errno: 1, code: 'SQLITE_ERROR'" 
    } 
}

На самом деле это должно быть отформатировано (см. Размещение одинарных кавычек) так

{ 
    records: { 
        Error: 'SQLITE_ERROR: no such table: showcaseUsers',
        errno: 1, 
        code: 'SQLITE_ERROR'
    } 
}

Обновление: необходимо хранить правильно отформатированные данные в базе данных. Если вы пропустили его, то у вас останется ручной анализ данных, которые вы получаете от SQLite.

Полезные ресурсы

  • 3
    Да, но я получаю этот объект из базы данных SQLITE, поэтому мне приходится иметь дело с ним как есть. Как я могу получить доступ к этой неправильно отформатированной части объекта?
  • 0
    Прежде всего, необходимо хранить правильно отформатированные данные в базе данных. Если вы пропустили его, то у вас останется ручной анализ данных, которые вы получаете от SQLite.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню