😺

✍️ 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 }));

より高度な制御が可能で、BufferSymbol なども正確に見えます。

方法3: JSON.stringify() を使う

console.log(JSON.stringify(sampleData, null, 2));

ただし、関数や SymbolDateBuffer などはそのままでは適切にシリアライズされないことがあります。


まとめ

方法 特徴
console.log() ネスト2階層まで、省略される
console.dir() ネスト全展開可能、シンプルに使える
util.inspect() 高度な制御が可能、デバッグに最適
JSON.stringify() JSON形式で出力、特殊型に注意が必要

Node.jsでのデバッグを快適にするには、console.dir()util.inspect() の使い分けが非常に有効です。

開発中にオブジェクトの構造を正確に確認したいときは、ぜひ活用してみてください。

Discussion