Node.js/Firestoreで学んだCLI開発の極意:ExcelデータをFirestoreにインポートするための環境構築からデータ設計まで
Meg
Meg
2026-06-18
業務で初となるFirestore一括更新CLIツールを経験し、ローカル環境での依存関係解決(npm)、セキュリティ管理(秘密鍵)、エラーデバッグ手法に加え、NoSQLでも重要な「リレーショナルなデータ設計」の重要性を体系的に学びました。Node.js初心者から中級者向けの実践的な技術記録です。

はじめに

今回は、業務で初めてFirestoreへのデータベース一括更新を行うCLI(Command Line Interface)ツールを触る機会がありました。 環境構築の手順から、Node.jsの仕組み、反映前に遭遇したエラーのデバッグ、そしてリレーショナルなデータ設計の視点まで、非常に多くの学びがあったので備忘録としてブログに残します。

UIのないスクリプトやCLIツールの操作に苦手意識がある方や、これからNode.jsでツールを作ってみたい方の参考になれば幸いです。


1. サーバーレスの原点とNode.js環境構築の仕組み

今回、他の開発者が作成したNode.js製のデータ移行スクリプト(jsファイル)を共有してもらい、自分のローカル環境で動かすところからスタートしました 。

そこで最初の壁となったのが、「ソースコード単体だけではプログラムは動かない」ということです 。

なぜ node script.js だけでは動かないのか?

JavaScriptのコード内に require('firebase-admin') のような外部ライブラリの引用(インポート)がある場合、その実体となるライブラリがPC内に存在しないとエラーになります 。 Node.jsでは、これらの依存ライブラリは node_modules というフォルダの中に格納されます 。

鍵を握る package.jsonnpm i

巨大な node_modules フォルダをそのまま開発者間で共有したり、サーバーに転送したりするのは非効率です。そのため、Node.jsでは「どのライブラリが必要か」のレシピが書かれた軽量な package.json ファイルだけを共有します 。

  • npm install(または npm i)の実行 コマンドを叩くことで、package.json のレシピを基に、必要なライブラリが自動的に一括ダウンロードされ、node_modules フォルダが生成されます 。これにより、初めてスクリプトが動く状態になります 。

  • サーバーレスの思想との繋がり この「コードと設定ファイル(package.json)だけを転送し、実行環境側で高速に依存関係を組み立てて起動する」という仕組みは、現代のCloud Functionsなどのサーバーレス技術の原点にもなっています 。


2. CLIツールを実行・開発する際の実践ステップ

今回学んだ、Node.jsで新しくCLIツールを作成、あるいは人が作ったツールを安全に実行する際的正攻法の手順がこちらです 。

自分で新しくCLIツールを作る場合の手順

1. 専用フォルダの作成: 安全のため、必ず他のプロジェクトとは隔離した新しいフォルダを作成する 。

2. プロジェクトの初期化: npm init を実行し、新しく package.json を生成する 。

3. ロジックの実装: メインとなる index.js などのファイルに処理を記述する 。

4. ライブラリの追加: 必要なライブラリがあれば、npm install <ライブラリ名> で随時追加していく 。

人のツールをもらって実行する場合の手順

1. フォルダの隔離: 同様に、安全な作業用フォルダを新しく作成してファイルを配置する 。

2. 設定ファイルの確認: スクリプトファイルだけでなく、package.json も漏れなく同じフォルダに格納する 。

3. 依存関係の解消: npm i を実行して環境を整える 。


3. Firestore連携におけるセキュリティとバックアップの鉄則

データベースを直接操作するCLIツールは、非常に大きな権限を持つため、実行には細心の注意が必要です 。

① サービスアカウント(秘密鍵)の取り扱い

Firestoreに外部のCLIツールからアクセスするためには、Firebaseコンソールの「プロジェクトの設定」>「サービスアカウント」から秘密鍵(JSONファイル)を生成して読み込ませる必要があります 。

* 注意点: この鍵が漏洩すると、データベースの破壊やデータ流出に直結する最大権限を持っています 。

* 対策: コード内に鍵の情報を直書きせず外部ファイルから読み込む構成にし、作業が終わったらローカルPC内からも確実に削除するか、厳重に管理する必要があります 。

② 一括更新前のバックアップは「絶対」

今回は検証環境(Staging環境)での作業でしたが、一括更新スクリプトを走らせる前には、必ず既存データの書き出し(エクスポート)によるバックアップを取る意識が重要です 。 もし他の開発者が検証環境でデータを使ってテストしていた場合、スクリプトの不具合でデータを意図せず上書き・削除してしまうと、チーム全体の開発を止めてしまうリスクがあるためです 。


4. トラブルシューティング:データ不備によるエラーのデバッグ

実際にスクリプトを実行した際、コンソールにいくつかのエラーが出力されました 。

ログを恐れず、カギ括弧や区切り文字を読み解く

エラーが発生した際、コンソールに出力された console.error の構成を落ち着いて確認しました 。 「何のエラーメッセージ自体なのか」と「どのデータ行で発生したのか」が文字列結合やカンマ区切りで表示されているため、ログを横にスクロールしながら細かく見ていくことで、原因が「インポート元データの列のズレ(データの不備)」にあることを突き止めることができました 。

また、まずは反映のコマンドを外し、Dry run(テスト実行)モードで実行結果のログを確認し、元データと突き合わせるプロセスの大切さを学びました 。


5. 一歩進んだ学び:NoSQL(Firestore)でも重要なデータ構造設計

今回の指摘によって気づいたデータ同士の紐付け(リレーショナルな設計)の視点でした 。

一括インポートしようとしていた新しいコレクション(テーブル)において、ドキュメントIDに特定のIDをそのまま割り当てようとしていました 。しかし、これだと「他のコレクションとどうやって関連性(リレーション)を持たせるのか」「主キー(ユニークなID)として適切に機能するのか」というデータ構造上の問題が発生することが分かりました 。

FirestoreのようなNoSQLデータベースであっても、以下の設計視点が不可欠です。

  • 各ドキュメントにはユニークな主キー(ID)を持たせる 。

  • 複数のコレクション間でデータを参照し合う場合は、結合のための外部キー(参照用ID)をデータ構造内に正しく定義する 。

今回は、データの構造(ER図のような関係性)をあらかじめAIなども活用して整理し、スクリプト側のマッピングロジックを修正することで、綺麗なデータ構造でインポートすることができました 。


まとめ

今回の作業を通じて、単に「データベースを更新できた」という結果だけでなく、以下の深い学びを得ることができました。

1. Node.jsのパッケージ管理(npm)の裏側にある仕組みと、サーバーレスへの繋がり 2. 高権限のCLIツールを扱うときのセキュリティ意識とバックアップの重要性 3. エラーログからデータの不備を特定し、コード側で調整するデバッグ力 4. ただデータを入れるだけでなく、テーブル(コレクション)間の繋がりを意識したデータ設計の視点

最初はターミナルでの作業やAIを交えたコード修正に緊張感もありましたが、仕組みを理解して一つずつ壁を乗り越えることで、純粋にプログラミングやインフラの面白さを体感できました 。 今回の学びを活かし、次は「自分でCLIツールをゼロから作ってみる」ことにも挑戦してみたいと思います!