获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

升级到 Node.js SDK Admin SDK v10(模块化 SDK)

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Admin Node.js SDK 版本 10 引入了两个重要的变化:

  • 停止支持 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 提供了多个带有命名导出的模块入口点。我们建议开发人员使用这些新入口点来访问 SDK 的各种 API,而不是使用全局admin命名空间。

以下是上面的示例使用新模块入口点的样子:

打字稿

// 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');

节点.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这样的三重嵌套类型标识符。由于每种类型都属于一个模块,因此您可以通过它们的短名称来导入它们,例如UserRecordReference

以下是自 v10 起 SDK 中可用的所有模块入口点:

  • firebase 管理员/应用程序
  • firebase 管理员/身份验证
  • firebase-管理员/数据库
  • firebase-admin/firestore
  • firebase-admin/instance-id
  • firebase 管理员/机器学习
  • firebase 管理员/消息
  • firebase-admin/项目管理
  • firebase 管理员/远程配置
  • firebase 管理员/安全规则
  • firebase 管理员/存储

下表显示了每个旧命名空间函数的替换导入语法:

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();

使用导出的函数而不是 App 上的方法

在旧版 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 开发人员也可以在其代码中使用exportimport关键字。从 v10 版本开始,Admin Node.js SDK 还提供 ES 模块支持,以便在普通 Node.js 上实现 ES 模块的开发人员可以使用import语法导入 SDK。

要将 ES 模块与 Admin SDK 一起使用,首先确保您已为 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');