😺
✍️ Node.jsでオブジェクトが[object Object]と表示される原因と対処法
JavaScript(Node.js)でログ出力を行う際に、ネストされたオブジェクトの一部が "[object Object]" と表示されてしまうことがあります。この記事ではその原因と、見やすく詳細な構造を表示するための方法を紹介します。
問題の背景
以下のように console.log() を使ってオブジェクトを出力した際:
const sampleData = {
id: 101,
user: {
name: "Alice",
contact: {
email: "alice@example.com",
phone: "000-0000-0000"
}
},
status: "active",
metadata: {
createdAt: new Date(),
updatedAt: new Date(),
tags: ["sample", "log", "debug"],
config: {
theme: "dark",
options: {
showSidebar: true,
enableLogging: false
}
}
}
};
console.log(sampleData);
このような出力になってしまうことがあります:
{
id: 101,
user: { name: 'Alice', contact: [Object] },
status: 'active',
metadata: { createdAt: 2024-01-01T00:00:00.000Z, updatedAt: 2024-01-01T00:00:00.000Z, tags: [Array], config: [Object] }
}
[Object] や [Array] と表示されてしまい、中身が見えません。
原因:console.logのネスト深さ制限
Node.js の console.log() は、デフォルトでオブジェクトのネストを2階層までしか展開しません。それ以上は [Object] や [Array] という省略形になります。
対処法
方法1: console.dir() を使う
console.dir(sampleData, { depth: null, colors: true });
-
depth: nullを指定することで無限にネストを展開 -
colors: trueでターミナルで見やすく表示
方法2: util.inspect() を使う
import util from 'util';
console.log(util.inspect(sampleData, { depth: null, colors: true }));
より高度な制御が可能で、Buffer や Symbol なども正確に見えます。
方法3: JSON.stringify() を使う
console.log(JSON.stringify(sampleData, null, 2));
ただし、関数や Symbol、Date、Buffer などはそのままでは適切にシリアライズされないことがあります。
まとめ
| 方法 | 特徴 |
|---|---|
console.log() |
ネスト2階層まで、省略される |
console.dir() |
ネスト全展開可能、シンプルに使える |
util.inspect() |
高度な制御が可能、デバッグに最適 |
JSON.stringify() |
JSON形式で出力、特殊型に注意が必要 |
Node.jsでのデバッグを快適にするには、console.dir() や util.inspect() の使い分けが非常に有効です。
開発中にオブジェクトの構造を正確に確認したいときは、ぜひ活用してみてください。
Discussion