Firebase云功能介绍和项目设置方法

323 阅读10分钟

如果你的Flutter应用需要一个后台,Firebase提供了许多有用的服务,让你可以更快地发货。

通过添加云函数,你可以运行自定义的后端代码,而不必担心管理和扩展你自己的服务器。

本教程将给你一个关于Firebase的云函数的大致介绍,并指导你完成所有需要的安装步骤。

什么是云函数?

云函数是一种编写你自己的无服务器、事件驱动的后端的方法。

无服务器意味着您可以使用它们来部署您的后端代码**,而不需要配置任何服务器**。

云函数会根据负载自动扩展,并且内置了强大的安全性。因此,它们提供了良好的开发体验,因为你可以专注于重要的事情:编写你的后端代码

那么,我们如何运行云函数呢?

触发器

云函数的运行是为了响应谷歌云服务中的事件,包括你可能正在使用的任何Firebase产品。

换句话说。

云函数是响应事件而被触发的。

Firebase的云函数。触发器

你可以使用很多触发器,比如说。

  • 写入云端火库
  • 上传到云存储
  • Firebase认证中的新账户
  • 分析转换事件
  • Crashlytics事件
  • 传入的HTTPS请求

如果你愿意,你甚至可以按计划定期运行云函数。

当你使用云函数时,你的代码在谷歌服务器上运行,使你的应用逻辑集中化和安全化。因此,云函数是一个很好的地方,可以存储运行任何应该存在于客户端的代码。

实例

下面是一些你可以使用云函数的例子。

  • 认证触发器,当新用户登录时发送欢迎邮件。
  • 当Crashlytics中发现一个新问题时,接收电子邮件或Slack通知。
  • 当用户向Firebase Storage上传图片时,生成一个缩略图。
  • 修改或删除用户在你的应用中输入的任何攻击性词汇。
  • 向你的应用中的用户发送FCM通知(对聊天应用很有用)。
  • 对你的Firestore数据库进行索引,并通过利用Algolia等外部服务实现全文搜索。

这听起来不错。但在你编写你自己的云函数之前,你需要了解Node.js

Node.js

Node.js是一个运行时,允许你编写在服务器上运行的JavaScript代码。

它于2009年推出,已经变得非常流行,允许网络开发人员使用单一语言编写全栈应用程序。JavaScript

由于云函数在Node.js运行时上运行,你需要用JavaScript(或一种可以编译成JavaScript的语言)来编写云函数。

而如果你是为Firebase编写云函数,那么官方支持的语言只有JavaScript和 TypeScript.

注意:Node.js大受欢迎,许多公司用它来编写JavaScript(或TypeScript)的后端应用程序。你可以用它来构建你自己的REST API,使用Express.js,它还支持GraphQL和数据库,如MongoDB。
要了解这些以及更多的信息,我建议参加ZeroToMastery的Node.js完整课程,其中还包括一个关于TypeScript的模块。你可以使用这个联盟链接购买该课程。完整的Node.js开发人员在2022年:从零到精通

Node.js是一个非常有价值的学习主题。但现在让我们继续关注云函数。

Firebase云功能 设置指南

首先,我们要安装所有需要的工具。然后,我们将部署我们的第一个云功能。

1.安装节点

你可以按照本页的指示,在你的平台上下载并安装推荐的Node.js版本。

你的node安装也将包括Node Package Manager(npm)。把npm 看作是Dart包的Javascript等价物 pub

你可以运行node -vnpm -v 来检查哪些版本已经安装。

如果你的系统中需要多个版本的Node,可以考虑使用Node版本管理器

2.安装Firebase CLI

Firebase CLI是一个命令行工具,你可以用它来管理你的Firebase项目。

你可以通过运行以下命令在你的系统上全局安装它。

npm install -g firebase-tools

3.初始化一个新的Firebase项目

接下来,你准备创建一个新的Firebase项目。

Firebase控制台中,添加一个新的项目并给它一个名字(例如:hello-world )。

你会被问到是否要启用Google Analytics。你可以跳过这个问题,然后创建这个项目。

在本教程中,我们将只专注于云功能。如果你想在你的Flutter应用中使用Firebase,你需要做一些额外的配置。文档中包括苹果平台安卓网络的指南。

回到终端上,创建一个新的文件夹并移至该文件夹。

mkdir hello-world
cd hello-world

在这个阶段,你可以使用终端来完成剩余的步骤。但如果你喜欢使用VSCode,只要运行code . ,在当前文件夹上打开一个VSCode窗口。然后你就可以使用集成终端来完成设置。

接下来,让我们用Firebase登录并在命令提示符下确认。

> firebase login
Allow Firebase to collect CLI usage and error reporting information? (Y/n)

这将把我们带到一个浏览器窗口,我们可以用你的谷歌账户登录,并授权Firebase CLI访问。

登录后,我们可以回到VS代码中,初始化一个新的Firebase项目。

firebase init

这将显示一个交互式的提示,我们可以选择我们想启用的Firebase功能。

    ######## #### ########  ######## ########     ###     ######  ########
     ##        ##  ##     ## ##       ##     ##  ##   ##  ##       ##
     ######    ##  ########  ######   ########  #########  ######  ######
     ##        ##  ##    ##  ##       ##     ## ##     ##       ## ##
     ##       #### ##     ## ######## ########  ##     ##  ######  ########

You're about to initialize a Firebase project in this directory:

  /Users/andrea/work/codewithandrea/github/firebase-scratch/hello-world

? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert selectio
n)
❯◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
 ◯ Emulators: Set up local emulators for Firebase features

在这个例子中,我们将只选择功能。

接下来,这个提示显示。

=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we'll just set up a default project.

? Please select an option: (Use arrow keys)
❯ Use an existing project
  Create a new project
  Add Firebase to an existing Google Cloud Platform project
  Don't set up a default project

我们可以选择 "使用一个现有的项目",并选择我们之前在Firebase控制台中创建的项目。

接下来,让我们选择使用哪种语言。

=== Functions Setup

A functions directory will be created in your project with a Node.js
package pre-configured. Functions can be deployed with firebase deploy.

? What language would you like to use to write Cloud Functions? (Use arrow keys)
  JavaScript
❯ TypeScript

我建议使用TypeScript。下一步。

Do you want to use ESLint to catch probable bugs and enforce style? (Y/n)

一般来说,建议给你的项目添加linting。尽管ESLint的默认设置相当严格,如果你对TypeScript不是很有经验的话,你可能会很纠结。在本教程中,请随意停用。

一些文件将被创建。

✔  Wrote functions/package.json
✔  Wrote functions/tslint.json
✔  Wrote functions/tsconfig.json
✔  Wrote functions/src/index.ts
✔  Wrote functions/.gitignore

接下来,我们被要求安装依赖性。

? Do you want to install dependencies with npm now? (Y/n)

让我们选择 "Y "来安装依赖项。这将需要几秒钟,之后我们的项目就准备好了

项目概述

我们现在在项目中有了一些新的文件。

functions/
  node_modules/
  src/
    index.ts
  .gitignore
  package-lock.json
  package.json
  tsconfig.json
  tslint.json
.firebaserc
.gitignore
firebase.json

生成的package.json 文件看起来像这样。

{
  "name": "functions",
  "scripts": {
    "build": "tsc",
    "serve": "npm run build && firebase emulators:start --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "14"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "^9.8.0",
    "firebase-functions": "^3.14.1"
  },
  "devDependencies": {
    "typescript": "^3.8.0",
    "firebase-functions-test": "^0.2.0"
  },
  "private": true
}

注意,依赖项部分包括npm早先安装的firebase-adminfirebase-functions 包。

如果我们想添加更多的包,我们可以添加运行npm install <package-name> ,这反过来会。

  • 将新的软件包作为依赖项包含在里面package.json
  • 将它们(连同依赖项)安装在node_modules 文件夹内。

node_modules 包含很多东西。由于 为你管理,这个文件夹被默认添加到 。npm .gitignore

你好,世界

我们的项目现在已经准备好了,我们可以开始编写我们的第一个云功能。

项目的入口点定义在functions/src/index.ts 。 默认情况下,它看起来像这样。

import * as functions from 'firebase-functions';

// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
//
// export const helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// });

你可以取消对上面几行的注释,以启用helloWorld 云功能。

export const helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello from Firebase!");
});

这是一个简单的http函数,我们可以用它来响应一个网络请求。我们在这里所做的就是使用response 参数来发送一个字符串作为回应给客户端。

部署我们的第一个云函数

现在我们有了一个云函数,让我们来部署它吧

在终端上,我们可以输入。

cd functions
firebase deploy

作为这个过程的一部分,有几个步骤会发生。

  • The TypeScript linter runs and checks our code (if we enabled it earlier on).
  • 我们的云函数被编译成JavaScript,以便它能在Node.js运行时运行。
  • 最后,它被部署到谷歌云平台的一个服务器上。

一旦这个过程完成,函数的URL会被打印在控制台。

=== Deploying to 'hello-world-58ab7'...

i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run build

> functions@ build /Users/andrea/work/codewithandrea/github/firebase-scratch/hello-world/functions
> tsc

✔  functions: Finished running predeploy script.
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (34.87 KB) for uploading
✔  functions: functions folder uploaded successfully
i  functions: creating Node.js 8 function helloWorld(us-central1)...
✔  functions[helloWorld(us-central1)]: Successful create operation. 
Function URL (helloWorld): https://us-central1-hello-world-58ab7.cloudfunctions.net/helloWorld

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/hello-world-58ab7/overview

如果我们在浏览器中打开输出的URL,我们可以在屏幕上看到 "Hello from Firebase!"的响应。

恭喜你!你已经部署了你的第一个云函数你已经部署了你的第一个云函数🚀

结论

云函数是一个广泛的话题,还有很多东西需要学习。

幸运的是,Firebase团队已经发布了一个非常好的关于云函数的系列视频。

这涵盖了许多有用的概念,例如。

  • TypeScript中的承诺、async、await
  • 错误处理
  • 云函数的触发器

一旦你熟悉了基础知识,可以看看Firebase团队的函数样本库。

这个项目的所有源代码都是用JavaScript写的。但如果你想了解云函数的许多用例,它是一个很好的资源。

如果你想挑战一下,你可以尝试将一些样本转换为TypeScript。

其他资源

Firebase的官方云函数文档包含了你需要开始使用的一切。

特别是,我发现这些资源很有用。

除此以外,你还可以看看Fireship.io的这门免费课程。

如果你想深入了解Node.js,我推荐ZeroToMastery的这个课程(联盟链接)。

编码愉快!