Node.js SDK Admin SDK v10(モジュラー SDK)にアップグレードする

Admin Node.js SDK のバージョン 10 では、次の 2 つの重要な変更が導入されました。

  • Node.js 10 のサポートの終了(これは互換性を破る変更です)
  • SDK でのモジュラー API パターンの採用

このガイドではデベロッパーに向けて、既存の Node.js アプリを Admin SDK の以前のバージョンから v10 にアップグレードするための手順や情報を説明します。

Node.js を v12 以降に更新する

Admin Node.js SDK v10 のリリースに伴い、Firebase での Node.js 10 のサポートは終了しました。Admin SDK を使用する場合は、Node.js 12 以降を使用する必要があります。Admin Node.js SDK を Cloud Functions for Firebase と併用している場合は、Node.js のバージョンを 12 以降にアップグレードしたことを確認してください。

名前空間の代わりにモジュールを使用する

Admin Node.js SDK は当初より、ネストされた名前空間階層として構造化されている安定した API を提供しています。そのため、デベロッパーは次のようなコードの記述方法に慣れていると思われます。

// Import the global admin namespace
import * as admin from 'firebase-admin';

const app: admin.app.App = admin.initializeApp();

const token: string = await admin.auth().createCustomToken('alice');

const user: admin.auth.UserRecord = await admin.auth().getUser('bob');

v10 より、Admin Node.js SDK は名前付きエクスポートを使用する複数のモジュール エントリ ポイントを提供します。今後はグローバルな admin 名前空間ではなく、これらの新しいエントリ ポイントを使用して SDK のさまざまな API にアクセスすることをおすすめします。

新しいモジュール エントリ ポイントを使用すると、上記の例は次のようになります。

TypeScript

// Import only what you need
import { initializeApp, App } from 'firebase-admin/app';
import { getAuth, UserRecord } from 'firebase-admin/auth';

const app: App = initializeApp();

const token: string = await getAuth().createCustomToken('alice');

const user: UserRecord = getAuth().getUser('bob');

Node.js

// Import only what you need
const { initializeApp } = require('firebase-admin/app');
const { getAuth } = require('firebase-admin/auth');

const app = initializeApp();

const token = await getAuth().createCustomToken('alice');

const user = getAuth().getUser('bob');

v10 モジュラーのエントリ ポイントを使用する

上の例では、グローバルな admin 名前空間をインポートしていません。代わりに、複数のモジュール エントリ ポイントから必要なシンボルのみを明示的にインポートします。また、TypeScript のデベロッパーは、admin.auth.UserRecordadmin.database.Reference のような、三重のネストになっているタイプ識別子を使用する必要がなくなりました。各タイプが 1 つのモジュールに属するため、UserRecordReference のような略称でインポートできます。

v10 の SDK で利用可能なすべてのモジュール エントリ ポイントは、次のとおりです。

  • firebase-admin/app
  • firebase-admin/auth
  • firebase-admin/database
  • firebase-admin/firestore
  • firebase-admin/instance-id
  • firebase-admin/machine-learning
  • firebase-admin/messaging
  • firebase-admin/project-management
  • firebase-admin/remote-config
  • firebase-admin/security-rules
  • firebase-admin/storage

以下の表は、従来の名前空間関数に代わるインポート構文を示します。

v9 v10
admin.initializeApp() import { initializeApp } from 'firebase-admin/app'

initializeApp();

admin.app() import { getApp } from 'firebase-admin/ap'

getApp();

admin.credential.cert() import { cert } from 'firebase-admin/app'

cert();

admin.auth() import { getAuth } from 'firebase-admin/auth'

getAuth();

admin.database() import { getDatabase } from 'firebase-admin/database'

getDatabase();

admin.firestore() import { getFirestore } from 'firebase-admin/firestore'

getFirestore();

admin.instanceId() import { getInstanceId } from 'firebase-admin/instance-id'

getInstanceId();

admin.machineLearning() import { getMachineLearning } from 'firebase-admin/machine-learning'

getMachineLearning();

admin.messaging() import { getMessaging } from 'firebase-admin/messaging'

getMessaging()

admin.projectManagement() import { getProjectManagement } from 'firebase-admin/project-management'

getProjectManagement();

admin.remoteConfig() import { getRemoteConfig } from 'firebase-admin/remote-config'

getRemoteConfig();

admin.securityRules() import { getSecurityRules } from 'firebase-admin/security-rules'

getSecurityRules()

admin.storage() import { getStorage } from 'firebase-admin/storage'

getStorage();

アプリのメソッドの代わりにエクスポートされた関数を使用する

従来の API では、App オブジェクトによって app.auth()app.database() などの多数のメソッドを公開していました。今後は、これらのメソッドは使用しないでください。代わりに、上記のモジュール エントリ ポイントを使用して、特定の App オブジェクトをスコープとするサービス インスタンスを取得し、その他のアプリ固有のタスクを実行することをおすすめします。

v9 v10
app.auth() import { getAuth } from 'firebase-admin/auth';

getAuth(app);

app.database() import { getDatabase } from 'firebase-admin/database';

getDatabase(app);

app.database(url) import { getDatabaseWithUrl } from 'firebase-admin/database';

getDatabaseWithUrl(url, app);

app.firestore() import { getFirestore } from 'firebase-admin/firestore'

getFirestore(app);

app.instanceId() import { getInstanceId } from 'firebase-admin/instance-id'

getInstanceId(app);

app.machineLearning() import { getMachineLearning } from 'firebase-admin/machine-learning'

getMachineLearning(app);

app.messaging() import { getMessaging } from 'firebase-admin/messaging'

getMessaging(app);

app.projectManagement() import { getProjectManagement } from 'firebase-admin/project-management'

getProjectManagement(app);

app.remoteConfig() import { getRemoteConfig } from 'firebase-admin/remote-config'

getRemoteConfig(app);

app.securityRules() import { getSecurityRules } from 'firebase-admin/security-rules'

getSecurityRules(app);

app.storage() import { getStorage } from 'firebase-admin/storage'

getStorage(app);

app.delete() import { deleteApp } from 'firebase-admin/app';

deleteApp(app);

ES モジュールのサポート

Node.js 12 以降では ES モジュールが試験運用版でサポートされ、TypeScript 以外のデベロッパーもコードで export キーワードと import キーワードを使用できるようになりました。v10 リリース以降、Admin Node.js SDK は ES モジュールもサポートしています。つまり、プレーンな Node.js に ES モジュールを実装するデベロッパーが import 構文を使用して SDK をインポートできます。

Admin SDK で ES モジュールを使用するには、まず Node.js ランタイムの ESM サポートが有効になっていることを確認します。通常は、package.json ファイルに "type": "module" フィールドを追加し、このサポートを有効にします。これで、次のようなアプリケーション コードを作成できるようになります。

// With {type: module} in the package.json...

// Import only what you need
import { initializeApp }  from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';

const app = initializeApp();

const token = await getAuth().createCustomToken('alice');

const user = getAuth().getUser('bob');