Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

升级到 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-admin/应用程序
  • firebase-admin/auth
  • firebase-admin/数据库
  • firebase-admin/firestore
  • firebase-admin/实例-id
  • firebase-admin/机器学习
  • firebase-admin/消息
  • firebase-admin/项目管理
  • firebase-admin/远程配置
  • firebase-admin/安全规则
  • firebase-admin/存储

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

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 modules 支持,这样在普通 Node.js 上实现 ES modules 的开发者可以使用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');