Перейти к консоли

处理依赖项

函数可以使用外部 Node.js 模块以及本地数据。Node.js 中的依赖项可通过 npm 进行管理,并在名为 package.json 的元数据文件中表示。Cloud Functions Node.js 运行时通常支持使用 npmyarn 进行安装。

要为函数指定依赖项,请将其添加到 package.json 文件中。

在此示例中,package.json 文件中列出了一个依赖项:

{
  "dependencies": {
    "uuid": "^3.0.1"
  }
}

此依赖项随后被导入函数中:

JavaScript

const uuid = require('uuid');

// Return a newly generated UUID in the HTTP response.
exports.getUuid = functions.https.onRequest((req, res) => {
  res.send(uuid.v4());
});

TypeScript

import * as uuid from 'uuid';

// Return a newly generated UUID in the HTTP response.
export let getUuid = functions.https.onRequest((req, res) => {
  res.send(uuid.v4());
}

在部署包中包括本地 Node.js 模块

您还可以将本地 Node.js 模块作为函数的一部分。要实现此目的,您可在 package.json 中使用 file: 前缀声明相关模块。在以下示例中,mymodule 引用您的模块名称,而 mymoduledir 是包含您的模块的目录:

{
  "dependencies": {
    "mymodule": "file:mymoduledir"
  }
}

此本地模块的代码不应位于您的 node_modules 文件夹中。您可以将其存储在函数目录的根目录中。

使用 npm 在本地安装 Node.js 模块

要在本地安装 Node.js 模块,最简单的方法是在包含您的 Cloud Functions 函数的文件夹中使用 npm install 命令。例如,以下命令可添加 uuid 模块:

npm install uuid

此命令同时执行两个步骤:

  1. 在您的 package.json 文件中,将最新版本的模块标记为依赖项。这一点很重要:Cloud Functions 仅安装已在您的 package.json 文件中声明的模块。
  2. 将该模块下载到 node_modules 目录中。这样您便可以在本地开发时使用该模块。

如果您的计算机上未安装 npm,请获取 npm

针对 TypeScript 的额外步骤

使用包含类型信息的库时,TypeScript 最为有用。这种情况下,TypeScript 可以发现语法错误,并使编辑器提供更好的自动填充建议。有些库(例如 firebase-adminfirebase-functions)本身就带有 TypeScript 定义。

许多库没有自己的 TypeScript 定义。DefinitelyTyped 项目提供适用于大多数常用库的社区维护的定义。DefinitelyTyped 以同一个 NPM 软件包名发布这些定义,但这些定义位于“@types”组织内。例如,您可以使用以下命令为 uuid 库安装类型信息:

npm install @types/uuid

随着对 TypeScript 越来越熟悉,您可以将两种安装方法结合使用:

npm install uuid @types/uuid

类型依赖项应与库依赖项为同一种类。例如,不应将 uuid 保存为普通依赖项,而将 @types/uuid 保存为开发依赖项或对等依赖项。

加载 Node.js 模块

使用 Node.js require() 函数加载已安装的任何 Node.js 模块。您还可以使用 require() 函数导入与函数一起部署的本地文件。

如果您使用 TypeScript 编写函数,则可以按同样的方式使用 import 语句来加载您已安装的任何 Node.js 模块。

使用专用模块

若要使用专用 npm 模块,您必须在位于函数目录下的 .npmrc 文件中提供 npm 注册表所对应的凭据(身份验证令牌)。npm 文档说明了如何创建自定义只读访问令牌。我们不建议使用在主目录中创建的 .npmrc 文件,因为它包含读写令牌。部署期间不需要写入权限,这可能会带来安全风险。

如果您未使用私有代码库,请勿添加 .npmrc 文件,因为该文件可能会延长函数的部署时间。