如果你的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 -v
和npm -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-admin
和firebase-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的官方云函数文档包含了你需要开始使用的一切。
特别是,我发现这些资源很有用。
- 从你的应用程序中调用函数(又称可调用函数)
- 通过HTTP请求调用函数
- Cloud Firestore的触发器
- 管理函数的部署和运行时选项
- 环境配置(对设置API密钥很有用,不需要硬编码)。
- 用Firebase主机部署到多个环境
除此以外,你还可以看看Fireship.io的这门免费课程。
如果你想深入了解Node.js,我推荐ZeroToMastery的这个课程(联盟链接)。
编码愉快!