Как вывести полный объект в console.log в Node.js вместо '[Object]'?
Проблема с глубиной вывода объектов в Node.js
По умолчанию console.log() в Node.js ограничивает глубину отображения объектов до 2 уровней. Это сделано для предотвращения бесконечной рекурсии при выводе циклических ссылок и для экономии места в консоли. Однако при отладке это часто мешает.
Решение 1: Использование console.dir() с опцией depth
Самый простой и рекомендуемый способ — использовать метод console.dir() с параметром depth: null, который убирает ограничение глубины:
const user = {
name: 'Иван',
age: 30,
address: {
city: 'Москва',
street: 'Ленина',
house: 10
},
hobbies: ['книги', 'спорт', 'программирование']
};
console.dir(user, { depth: null });
// Выведет полное содержимое без сокращений
Параметр depth: null означает "без ограничения глубины". Вы также можете задать конкретное число уровней, например depth: 5.
Решение 2: Использование JSON.stringify()
Если вам нужно вывести объект в виде форматированного JSON, используйте JSON.stringify() с отступами:
console.log(JSON.stringify(user, null, 2));
// Выведет:
// {
// "name": "Иван",
// "age": 30,
// "address": {
// "city": "Москва",
// "street": "Ленина",
// "house": 10
// },
// "hobbies": ["книги", "спорт", "программирование"]
// }
Второй параметр (null) — это функция-заменитель (можно использовать для фильтрации), третий (2) — количество пробелов для отступов. Недостаток: методы объекта и циклические ссылки не будут отображены.
Решение 3: Использование util.inspect()
Метод util.inspect() из встроенного модуля util даёт максимальный контроль:
const util = require('util');
console.log(util.inspect(user, {
depth: null, // без ограничения глубины
colors: true, // цветной вывод (работает не во всех консолях)
showHidden: false, // не показывать скрытые свойства
maxArrayLength: null // не ограничивать длину массива
}));
Решение 4: Переопределение console.log (для постоянного использования)
Если вы хотите, чтобы console.log() всегда выводил объекты полностью, можно переопределить его поведение в начале скрипта:
const util = require('util');
console.log = function(...args) {
return process.stdout.write(
args.map(a => typeof a === 'object' ? util.inspect(a, { depth: null, colors: true }) : a).join(' ') + '\n'
);
};
// Теперь обычный console.log будет выводить всё полностью
console.log(user);
Советы
- Для большинства случаев используйте
console.dir()— это самый простой и читаемый способ. - Для сохранения в файл используйте
JSON.stringify()— результат легко копируется и парсится. - Для сложных объектов с циклическими ссылками используйте
util.inspect()— он безопасно обрабатывает такие случаи. - В современных версиях Node.js (16+)
console.log()по умолчанию показывает больше уровней, но всё равно может обрезать глубоко вложенные структуры.
Альтернативный подход: Использование сторонних утилит для отладки
Если встроенных методов недостаточно, можно использовать специализированные библиотеки:
1. Библиотека pretty-print (pp)
npm install pretty-print
const pp = require('pretty-print');
pp(user); // Красивый цветной вывод с неограниченной глубиной
2. Использование отладчика Node.js
Вместо вывода в консоль можно использовать встроенный отладчик с командой node inspect:
// Запустите: node inspect script.js
// В отладчике используйте команду: repl
// Затем: user (нажмите Enter) — вы увидите полный объект
3. Временное решение: преобразование в Map
Если объект содержит циклические ссылки, можно временно преобразовать его в Map для просмотра:
const map = new Map(Object.entries(user));
console.log(map); // Map выводится полностью
4. Расширение прототипа (не рекомендуется для продакшена)
Object.prototype.log = function() {
console.log(JSON.stringify(this, null, 2));
};
user.log(); // Выведет полный JSON
Выберите способ, который лучше всего подходит под вашу задачу. Для быстрой отладки console.dir() обычно достаточно, а для сложных проектов стоит присмотреться к специализированным инструментам.