本文发表于个人站点,点击查看全文章 https://blog.poetries.top/2022/06/25/cloudbase-summary
- 前端进阶之旅:https://interview2.poetries.top
一、关于云开发介绍
云开发与serverless的区别
Serverless Framework
是无服务器应用框架,提供将云函数SCF
、API
网关、对象存储COS
、云数据库DB
等资源组合的业务框架,开发者可以直接基于框架编写业务逻辑,而无需关注底层资源的配置和管理。- 云开发(
Tencent CloudBase,TCB
)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等serverless
化能力,可用于云端一体化开发多种端应用(小程序、公众号、Web
应用、Flutter
客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。 - 二者最大的区别是:给开发者使用的平台支持不一样,云开发支持web端、QQ、微信小程序级静态网站托管等这些平台服务。
二、使用云开发创建一个nestjs项目
在产品中选择云开发产品
创建一个项目, 这里要选择好区域,下次创建了项目,区域不一样,可能项目就看不到
三、使用脚手架的方式创建
3.1 安装
全局安装脚手架包官方地址
代码语言:javascript复制npm i -g @cloudbase/cli
为了简化输入,cloudbase 命令可以简写成 tcb
测试安装是否成功
代码语言:javascript复制tcb -v
查看命令
代码语言:javascript复制tcb -h
3.2 登录
代码语言:javascript复制# CloudBase CLI 会自动打开云开发控制台获取授权,您需要点击同意授权按钮允许 CloudBase CLI 获取授权。如您没有登录,您需要登录后才能进行此操作。
tcb login
也可以使用下面的方式通过 API 秘钥直接登录,避免交互式输入
代码语言:javascript复制tcb login --apiKeyId xxx --apiKey xxx
3.3 创建项目
本地创建项目
代码语言:javascript复制tcb new [options] [appName] [templateUri]
# 比如
tcb new nest-cloundbase nest-starter
云开发项目是和云开发环境资源关联的实体,云开发项目聚合了云函数、数据库、文件存储等服务,您可以在云开发项目中编写函数,存储文件,并通过 CloudBase 快速的操作您的云函数、文件存储、数据库等资源。
云开发项目文件结构:
代码语言:javascript复制.
├── .gitignore
├── functions // 云函数目录
│ └── node-app
│ └── index.js
└── cloudbaserc.json // 项目配置文件
选择自己已经创建的环境,如果没有就 创建新环境,这时候会打开浏览器
本地打开项目并且安装依赖包
代码语言:javascript复制npm install
npm run dev
部署到线上
代码语言:javascript复制# 调用 tcb framework deploy
npm run deploy
部署完成后可以使用 tcb fn list
命令查看已经部署完成的函数列表
3.4 环境
查看所有环境
代码语言:javascript复制tcb env list
安全域名
当您需要在网页应用中使用云开发的身份验证服务时,您需要将您的网站的域名(发起请求的页面的域名)加入安全域名名单中。安全域名是云开发服务认可的用户请求来源域名,所有来自非安全域名名单中的请求都不会被响应。
使用下面的命令查看所有配置的安全域名
代码语言:javascript复制tcb env domain list
新增安全域名
代码语言:javascript复制# 添加一个域名
tcb env domain create www.xxx.com
# 添加多个域名
tcb env domain create www.domain1.com/www.domain2.com/www.domain3.com
删除安全域名
代码语言:javascript复制tcb env domain delete
登录方式
代码语言:javascript复制当您需要使用云开发的身份验证服务时,您需要配置您想使用的登录方式。目前云开发支持自定义登录、微信公众平台、微信开放平台登录等多种登录方式。
# 您可以使用下面的命令列出环境配置的登录方式列表,查看环境配置的登录方式,以及相关的状态。
tcb env login list
您可以使用下面的命令新建登录方式:
代码语言:javascript复制tcb env login create
您需要选择配置的平台,登录方式状态,以及对应的 AppId 和 AppSecret,登录方式请选择启用。在添加方式时不会校验 AppId 和 AppSecret 的有效性,只有在请求时,AppId 和 AppSecret 才会被校验,所以请确保您添加的 AppId 和 AppSecret 是有效的。
修改登录方式
您也可以使用
tcb env login update
修改已经配置的登录方式,如切换启用状态,修改 AppId 和 AppSecret。
动态变量
代码语言:javascript复制在
cloudbaserc.json
中声明"version": "2.0"
即可启用新的特性,新版配置文件只支持 JSON 格式
// 动态变量特性允许在 `cloudbaserc.json` 配置文件中使用动态变量,从环境变量或其他数据源获取动态的数据。使用 `{{}}` 包围的值定义为动态变量,可以引用数据源中的值。如下所示
{
"version": "2.0",
"envId": "envId",
"functionRoot": "./functions",
"functions": [
{
"name": "{{variable}}"
}
]
}
环境变量
CloudBase 支持使用 .env
类型文件作为主要数据源,使用不同的后缀区分不同的阶段、场景,如 .env.development
可以表示开发阶段的配置,.env.production
可以表示生产环境的配置
当指定
--mode [mode]
时,会再加载.env.[mode]
文件,并按照如下的顺序合并覆盖同名变量:.env.[mode] > .env.local > .env
即.env.[mode]
中的同名变量会覆盖.env.local
和.env
文件中的同名变量当使用
tcb framework deploy --mode test
命令时,会自动加载.env
,.env.local
以及.env.test
等三个文件中的环境变量合并使用。
我们建议你将秘钥等私密配置放在 .env.local
文件中,并将 .env.local
加入 .gitignore
配置中
如 .env.local
文件中存在以下变量
DB_HOST = localhost
DB_USER = root
DB_PASSWORD = s1mpl3
则可以在配置文件中使用
代码语言:javascript复制{
"version": "2.0",
"envId": "xxx",
"functionRoot": "./functions",
"functions": [
{
"name": "test",
"envVariables": {
"PASSWORD": "{{env.DB_PASSWORD}}"
}
}
]
}
3.5 云函数操作
函数配置cloudbaserc.json
参考配置
代码语言:javascript复制// https://docs.cloudbase.net/cli/functions/configs
// https://docs.cloudbase.net/cli-v1/functions/configs
{
// version 表示当前配置文件的版本,目前支持的版本号有:"2.0"。当 version 字段不存在时,默认当前配置文件为 "1.0" 版本。
"version": "",
// 关联环境 ID
"envId": "dev-xxxx",
"functionRoot": "./functions", // 云函数函数代码存放的文件夹路径,相对于根目录的路径。
// region 指定了当前环境的地域信息,上海地域的环境可以不填,其他地域的环境则必须填写。
"region": "",
// 函数配置项组成的数组
"functions": [
{
// functions 文件夹下函数文件夹的名称,即函数名
"name": "app",
// 超时时间,单位:秒 S
"timeout": 5,
// 环境变量
"envVariables": {
"key": "value"
},
// 私有网络配置,如果不使用私有网络,可不配置
"vpc": {
// vpc id
"vpcId": "vpc-xxx",
// 子网 id
"subnetId": "subnet-xxx"
},
// 运行时,目前可选运行包含:Nodejs8.9, Nodejs10.15, Php7, Java8
// 此参数可以省略,默认为 Nodejs10.15
"runtime": "Nodejs10.15",
// 是否云端安装依赖,仅支持 Node.js 项目
"installDependency": true,
// 函数触发器,说明见文档: https://cloud.tencent.com/document/product/876/32314
"triggers": [
{
// name: 触发器的名字
"name": "myTrigger",
// type: 触发器类型,目前仅支持 timer (即定时触发器)
"type": "timer",
// config: 触发器配置,在定时触发器下,config 格式为 cron 表达式
"config": "0 0 2 1 * * *"
}
],
// 函数处理入口,Node.js 和 PHP 项目可以省略,默认值为 index.main
// 因 Java 的 handler 配置较为特殊,所以当运行时为 Java 时,handler 不能省略
// 如:package.Class::mainHandler
"handler": "index.main",
// functions:invoke 本地触发云函数时的调用参数
"params": {},
// 部署/更新云函数时忽略的文件
"ignore": [
// 忽略 markdown 文件
"*.md",
// 忽略 node_modules 文件夹
"node_modules",
"node_modules/**/*"
]
}
]
}
下面为目前所有支持的配置项
配置项 | 是否必填 | 类型 | 描述 |
---|---|---|---|
name | 是 | String | 云函数名称,即为函数部署后的名称 |
params | 否 | Object/JSONObject | CIL 调用云函数时的函数入参 |
triggers | 否 | Array | 触发器配置 |
handler | 否 | String | 函数处理方法名称,名称格式支持“文件名称.函数名称”形式 |
ignore | 否 | String/Array<String> | 部署/更新云函数代码时的忽略文件,支持 glob 匹配规则 |
timeout | 否 | Number | 函数超时时间(1 - 60S) |
envVariables | 否 | Object | 包含环境变量的键值对对象 |
vpc | 否 | VPC | 私有网络配置 |
runtime | 否 | String | 运行时环境配置,可选值: Nodejs8.9, Nodejs10.15 Php7, Java8 |
memorySize | 否 | Number | 函数内存,默认值为 256,可选 128、256、512、1024、2048 |
installDependency | 否 | Boolean | 是否云端安装依赖,目前仅支持 Node.js |
codeSecret | 否 | String | 代码加密秘钥,格式为 36 位大小写字母、数字 |
- 注:
runtime
默认为Nodejs10.15
,使用 Node.js 运行时可不填,使用 Php 和 Java 则必填。 - 启用代码加密后,将无法在小程序 IDE、腾讯云控制台中查看云函数的代码和信息
CloudFunctionTrigger
名称 | 是否必填 | 类型 | 描述 |
---|---|---|---|
name | 是 | String | 触发器名称 |
type | 是 | String | 触发器类型,可选值:timer |
config | 是 | String | 触发器配置,在定时触发器下,config 格式为 cron 表达式 |
VPC
名称 | 是否必填 | 类型 | 描述 |
---|---|---|---|
vpcId | 是 | String | VPC Id |
subnetId | 是 | String | VPC 子网 Id |
更新函数运行时配置
代码语言:javascript复制创建函数式,Cloudbase CLI 会为函数提供一些默认的配置,所以您不需要添加配置信息也可以直接部署函数。您也可以通过下面的命令修改函数的运行时配置
# 更新 app 函数的配置
tcb fn config update app
# 更新配置文件中所有函数的配置信息
tcb fn config update
目前支持修改的函数配置包含超时时间 timeout
、环境变量 envVariables
、运行时 runtime
,vpc网络以及 installDependency
等选项。
CloudBase CLI 会从配置文件中读取函数的配置信息并更新,CloudBase CLI 会更新配置文件中存在的函数的所有配置,暂不支持指定更新单个配置选项。
部署
fn deploy
命令部署函数的文件大小总计不能超过50 M
,否则可能会部署失败。
在一个包含 cloudbaserc.json
配置文件的项目下,您可以直接使用下面的命令部署云函数:
tcb fn deploy <functionName>
使用 fn deploy
时,functionName
选项是可以省略的,当 functionName
省略时,Cloudbase CLI 会部署配置文件中的全部函数:
# 部署配置文件中的全部函数
tcb fn deploy
全部参数
代码语言:javascript复制Usage: tcb fn deploy [options] [name]
部署云函数
Options:
-e, --envId <envId> 环境 Id
--code-secret <codeSecret> 传入此参数将保护代码,格式为 36 位大小写字母和数字
--force 如果存在同名函数,上传后覆盖同名函数
--path <path> 自动创建HTTP 访问服务访问路径
--all 部署配置文件中的包含的全部云函数
--dir <dir> 指定云函数的文件夹路径
-h, --help 查看命令帮助信息
默认选项
Cloudbase CLI 为 Node.js 云函数提供了默认选项,您在部署 Node.js 云函数时可以不用指定云函数的配置,使用默认配置即可部署云函数。
云函数默认配置:
代码语言:javascript复制{
// 超时时间 5S
"timeout": 5,
// 运行时
"runtime": "Nodejs10.15",
// 自动安装依赖
"installDependency": true,
// 处理入口
"handler": "index.main",
// 忽略 node_modules 目录
"ignore": ["node_modules", "node_modules/**/*", ".git"]
}
deploy 命令做了啥
fn deploy
会读取 cloudbaserc.json
文件中指定函数的配置,并完成以下几项工作
- 将函数打包成压缩文件,并上传函数代码。
- 部署函数配置,包括超时时间、网络配置等。
- 部署函数触发器。
管理云函数
- 您可以使用下面的命令列出所有云函数,查看函数的基本信息:
tcb fn list
- 指定返回条数和偏移量
代码语言:javascript复制默认情况下,
fn list
命令只会列出前20
个函数,如果您的函数较多,需要列出其他的函数,您可以通过下面的选项指定命令返回的数据长度以及数据的偏移量:
-l, --limit <limit> 返回数据长度,默认值为 20
-o, --offset <offset> 数据偏移量,默认值为 0
代码语言:javascript复制# 返回前 10 个函数的信息
tcb fn list -l 10
# 返回第 3 - 22 个函数的信息(包含 3 和 22)
tcb fn list -l 20 -o 2
- 下载云函数代码
tcb fn code download <functionName> [destPath]
默认情况下,函数代码会下载到 functionRoot
下,以函数名称作为存储文件夹,您可以指定函数存放的文件夹地址,函数的所有代码文件会直接下载到指定的文件夹中。
- 查看函数详情
# 查看 vue-echo 函数的详情
tcb fn detail vue-echo
- 删除函数
# 删除 app 函数
tcb fn delete app
# 删除配置文件中的所有的函数
tcb fn delete
- 复制函数
# 复制 app 函数为 app2 函数
tcb fn copy app app2
触发器
触发器是按照一定规则触发函数的模块的抽象,CloudBase 云函数目前仅支持定时触发器。
代码语言:javascript复制如果云函数需要定时/定期执行,即定时触发,您可以使用云函数定时触发器。已配置定时触发器的云函数,会在相应时间点被自动触发,函数的返回结果不会返回给调用方。
{
"version": "2.0",
"envId": "xxx",
"functions": [
{
// triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
"triggers": [
{
// name: 触发器的名字,规则见下方说明
"name": "myTrigger",
// type: 触发器类型,目前仅支持 timer (即定时触发器)
"type": "timer",
// config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见下方说明
"config": "0 0 2 1 * * *"
}
]
}
]
}
创建函数触发器
代码语言:javascript复制# 创建 app 函数配置的触发器
tcb fn trigger create app
Cloudbase CLI 会自动读取
cloudbaserc.json
文件中指定函数配置的定时触发器,并创建云函数触发器。如果配置文件中没有包含触发器配置,则会创建失败。
一个函数可以包含多个触发器,一个触发器包含了以下 3 个主要信息:name
, type
, config
{
// name: 触发器的名字,规则见下方说明
"name": "myTrigger",
// type: 触发器类型,目前仅支持 timer (即定时触发器)
"type": "timer",
// config: 触发器配置,在定时触发器下,config 格式为 cron 表达式
"config": "0 0 2 1 * * *"
}
当没有指定函数名时,Cloudbase CLI 会创建 cloudbaserc.json
文件包含的所有函数的所有触发器
删除函数触发器
代码语言:javascript复制# 删除 app 函数的名为 trigger 的触发器
tcb fn trigger delete app trigger
代码语言:javascript复制当没有指定函数名时,Cloudbase CLI 会删除
cloudbaserc.json
文件包含的所有函数的所有触发器。当只指定了函数名时,Cloudbase CLI 会删除指定函数的所有触发器,当同时指定了函数名称和触发器名称时,Cloudbase CLI 只会删除指定的触发器。
# 删除 cloudbaserc.json 文件中所有函数的所有触发器
tcb fn trigger delete
# 删除函数 app 的所有触发器
tcb fn trigger delete app
# 删除函数 app 的触发器 trigger
tcb fn trigger delete app trigger
触发器规则
- 定时触发器名称(name) :最大支持
60
个字符,支持a-z
,A-Z
,0-9
,-
和_
。必须以字母开头,且一个函数下不支持同名的多个定时触发器。 - 定时触发器触发周期(config):指定的函数触发时间。填写自定义标准的 Cron 表达式来决定何时触发函数。有关 Cron 表达式的更多信息,请参考以下内容。
Cron 表达式有七个必需字段,按空格分隔。其中,每个字段都有相应的取值范围:
排序 | 字段 | 值 | 通配符 |
---|---|---|---|
第一位 | 秒 | 0 - 59 的整数 | , - * / |
第二位 | 分钟 | 0 - 59 的整数 | , - * / |
第三位 | 小时 | 0 - 23 的整数 | , - * / |
第四位 | 日 | 1 - 31 的整数(需要考虑月的天数) | , - * / |
第五位 | 月 | 1 - 12 的整数或 JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV 和 DEC | , - * / |
第六位 | 星期 | 0 - 6 的整数或 MON、TUE、WED、THU、FRI、SAT 和 SUN,其中 0 指周日,1 指星期一,以此类推 | , - * / |
第七位 | 年 | 1970 - 2099 的整数 | , - * / |
通配符
通配符 | 含义 |
---|---|
,(逗号) | 代表取用逗号隔开的字符的并集。例如:在“小时”字段中 1,2,3 表示 1 点、2 点和 3 点 |
-(短横线) | 包含指定范围的所有值。例如:在“日”字段中,1 - 15 包含指定月份的 1 号到 15 号 |
*(星号) | 表示所有值。在“小时”字段中,* 表示每个小时 |
/(正斜杠) | 指定增量。在“分钟”字段中,输入 1/10 以指定从第一分钟开始的每隔十分钟重复。例如,第 11 分钟、第 21 分钟和第 31 分钟,以此类推 |
!在 Cron 表达式中的“日”和“星期”字段同时指定值时,两者为“或”关系,即两者的条件均生效。
下面列举一些 Cron
表达式和相关含义:
*/5 * * * * * *
表示每 5 秒触发一次0 0 2 1 * * *
表示在每月的 1 日的凌晨 2 点触发0 15 10 * * MON-FRI *
表示在周一到周五每天上午 10:15 触发0 0 10,14,16 * * * *
表示在每天上午 10 点,下午 2 点,下午 4 点触发0 */30 9-17 * * * *
表示在每天上午 9 点到下午 5 点内每半小时触发0 0 12 * * WED *
表示在每个星期三中午 12 点触发
代码更新
当您的函数代码发生改变时,您可以使用下面的命令更新您的云函数的代码:
代码语言:javascript复制# 更新 app 函数的代码
tcb fn code update app
fn code update
命令和fn deploy
命令的主要区别是:fn code update
命令只会更新函数的代码以及执行入口,不会修改函数的其他配置,而fn deploy
命令则会修改函数的代码、配置以及触发器等。
函数版本
您可以通过下面的命令查看函数版本:
代码语言:javascript复制tcb fn list-function-versions <name>
函数日志
您可以通过下面的命令打印云函数的运行日志,使用此命令时必须指定函数的名称:
代码语言:javascript复制# 查看 vue-echo 函数的调用日志
tcb fn log vue-echo
默认情况下,Cloudbase CLI 会打印最近的 20 条日志,您可以通过在命令后附加下面的可用选项指定返回日志的筛选条件:
代码语言:javascript复制-i, --reqId <reqId> 函数请求 Id
-o, --offset <offset> 数据的偏移量,Offset Limit不能大于10000
-l, --limit <limit> 返回数据的长度,Offset Limit不能大于10000
--order <order> 以升序还是降序的方式对日志进行排序,可选值 desc 和 asc
--orderBy <orderBy> 根据某个字段排序日志,支持以下字段:function_name,duration, mem_usage, start_time
--startTime <startTime> 查询的具体日期,例如:2019-05-16 20:00:00,只能与endtime 相差一天之内
--endTime <endTime> 查询的具体日期,例如:2019-05-16 20:59:59,只能与startTime 相差一天之内
-e, --error 只返回错误类型的日志
-s, --success 只返回正确类型的日志
如:tcb fn log app -l 2
打印 app
函数的最新 2 条日志信息
部署示例
- 编写
cloudbaserc.json文件
{
"version": "2.0",
"envId": "poetry-prod-xx",
"functionRoot": "./cloudfunctions",
"functions": [
{
"name": "vue-echo",
"timeout": 5,
"runtime": "Nodejs10.15",
"installDependency": true
}
]
}
- 部署,执行以下命令,部署指定函数名称
tcb fn deploy vue-echo
- 查看已部署的函数
tcb fn list
3.6 静态网站托管
云开发为开发者提供静态网页托管的能力,静态资源(HTML、CSS、JavaScript、字体等)的分发由对象存储 COS 和拥有多个边缘网点的 CDN 提供支持。您可在腾讯云控制台进行静态网站的部署,提供给您的用户访问。目前云开发静态网页托管能力仅在腾讯云云开发控制台支持,小程序 IDE 侧控制台暂不支持。
仅有付费方式为按量付费的环境可开通静态网页托管能力,预付费方式环境不可开通。
使用 CLI 操作静态网站服务前请先到云开发控制台开通静态网站服务。
全量部署
代码语言:javascript复制云开发 CLI 提供了直接部署网站文件的命令,在您需要部署的文件夹目录下,直接运行
tcb hosting deploy
命令即可将当前目前下所有的文件部署静态网站中。
# dist 构建目录
cd dist
# 部署全部文件
tcb hosting deploy -e envId
删除文件
您可以使用下面的命令删除静态网站的存储空间中的文件或文件夹
代码语言:javascript复制# cloudPath 为文件或文件夹的相对根目录的路径,为 目录/文件名 的形式,如 index.js、static/css/index.js 等
tcb hosting delete cloudPath -e envId
删除全部文件
云端路径为空时,表示删除全部文件
代码语言:javascript复制tcb hosting delete -e envId
查看文件列表
您可以使用下面的命令部署展示静态网站存储空间中文件
代码语言:javascript复制tcb hosting list -e envId
四、云开发登录鉴权
CloudBase 提供跨平台的登录鉴权功能,您可以基于此为自己的应用构建用户体系,包括但不限于:
- 为用户分配全局唯一的身份标识 uid;
- 储存和管理用户个人信息;
- 关联多种登录方式;
- 管理用户对数据、资源的访问权限;
- 用户行为的收集和分析。
同时,CloudBase 登录鉴权还是保护您的服务资源的重要手段,CloudBase 对用户端发来的每一个请求,都会进行身份和权限的检查,避免您的资源被恶意攻击者消耗或者盗用。
4.1 登录鉴权
每个登录 CloudBase 的用户,都有一个对应的 CloudBase 账号,用户通过此账号访问调用 CloudBase 的数据与资源。
- 每个账号都有全局唯一的 UID,即账号 ID,作为用户的唯一身份标识
- 每个账号可以添加、修改用户信息
- 每个账号除了最初的登录方式之外,还可以关联其它登录方式
登录状态的持久化
您可以指定登录状态如何持久保留。默认为 local
,相关选项包括
例如,对于网页应用,最佳选择是 local
,即在用户关闭浏览器之后仍保留该用户的会话。这样,用户不需要每次访问该网页时重复登录,避免给用户带来诸多不便体验。
访问令牌与刷新令牌
用户登录 CloudBase 之后,会获得访问令牌(Access Token
) 作为访问 CloudBase
的凭证,访问令牌默认具有两小时有效期。
登录时还会获得刷新令牌(Refresh Token),默认有效期 30 天,用于访问令牌过期后,获取新的访问令牌。
CloudBase 用户端 SDK 会自动维护令牌的刷新和有效期,开发者无需特别关注此流程。
匿名登录 的刷新令牌(
Refresh Token
)会在到期后自动续期,以实现长期的匿名登录状态。
管理用户
获取当前登录的用户
- 订阅登录状态变化的回调函数
代码语言:javascript复制获取当前用户,推荐在
Auth
对象上设置一个回调函数,每当用户登录状态转变时,会触发这个回调函数,并且获得当前的LoginState
:
import cloudbase from "@cloudbase/js-sdk";
const app = cloudbase.init({
env: "your-env-id"
});
const auth = app.auth();
// 设置一个观察者
auth.onLoginStateChanged((loginState) => {
if (loginState) {
// 此时用户已经登录
} else {
// 没有登录
}
});
- 直接获取当前用户
您还可以使用
Auth.currentUser
属性来获取当前登录的用户。如果用户未登录,则currentUser
为 null
您还可以使用 Auth.currentUser
属性来获取当前登录的用户。如果用户未登录,则 currentUser
为 null
const user = auth.currentUser;
if (user) {
// 此时用户已经登录
} else {
// 没有登录
}
获取用户个人资料
代码语言:javascript复制您可以通过
User
对象的各个属性来获取用户的个人资料信息:
const user = auth.currentUser;
let uid, nickName, gender, avatarUrl, location;
if (user) {
// 云开发唯一用户 id
uid = user.uid;
// 昵称
nickName = user.nickName;
// 性别
gender = user.gender;
// 头像URL
avatarUrl = user.avatarUrl;
// 用户地理位置
location = user.location;
}
更新用户个人资料
您可以使用 User.update
方法来更新用户的个人资料信息。例如:
const user = auth.currentUser;
user
.update({
nickName: "Tony Stark",
gender: "MALE",
avatarUrl: "https://..."
})
.then(() => {
// 更新用户资料成功
});
刷新用户资料信息
对于一个多端应用,用户可能在其中某个端上更新过自己的个人资料信息,此时其它端上可能需要刷新信息:
代码语言:javascript复制const user = auth.currentUser;
// 刷新用户信息
user.refresh().then(() => {
// 刷新后,获取到的用户信息即为最新的信息
const { nickName, gender, avatarUrl } = user;
});
账户关联
关联微信登录
- 用户以任意一种登录方式(除微信登录)登录云开发
- 获取 Provider:
const auth = app.auth();
const provider = auth.weixinAuthProvider({
appid: "....",
scope: "snsapi_base"
});
- 重定向到提供方的页面进行登录:
auth.currentUser.linkWithRedirect(provider);
用户在微信的页面登录之后,会被重定向回您的页面。然后,可以在页面加载时通过调用 Provider.getLinkRedirectResult()
来获取关联结果:
const provider = auth.weixinAuthProvider();
provider.getLinkRedirectResult().then((result) => {
// 关联成功
});
关联自定义登录
- 用户以任意一种登录方式(除自定义登录)登录云开发;
- 使用
User.linkWithTicket
,获取自定义登录Ticket
后,关联自定义用户:
const auth = app.auth();
const ticket = "......"; // 自定义登录 Ticket
auth.currentUser.linkWithTicket(ticket).then((result) => {
// 关联成功
});
关联邮箱密码登录
- 用户以任意一种登录方式登录云开发
- 更新用户的密码:
const auth = app.auth();
auth.currentUser.updatePassword(password).then(() => {
// 设置密码成功
});
- 更新用户的邮箱,用户点击验证邮件之后,便关联成功:
auth.currentUser.updateEmail(email).then(() => {
// 发送验证邮件成功
});
关联用户名密码登录
- 用户以任意一种登录方式(除匿名登录)登录云开发:
// 以邮箱登录为例
await app.auth().signInWithEmailAndPassword(email, password);
- 绑定登录的用户名:
await app.auth().currentUser.updateUsername(username); // 绑定用户名
- 绑定成功后,便可以使用用户名密码登录:
const loginState = await app.auth().signInWithUsernameAndPassword(username, password); // 用户名密码登录
最佳实践
避免重复登录
代码语言:javascript复制执行登录流程之前,我们非常建议您先判断用户端是否已经登录 CloudBase,如已经登录,那么不需要执行登录流程,以避免无意义的重复登录。
const auth = app.auth();
// 应用初始化时
if (auth.hasLoginState()) {
// 此时已经登录
} else {
// 此时未登录,执行您的登录流程
}
登录状态的持久保留
代码语言:javascript复制对于网页应用,最佳选择是
local
,即在用户关闭浏览器之后仍保留该用户的会话。这样,用户不需要每次访问该网页时重复登录,避免给用户带来诸多不便体验
const auth = app.auth({
persistence: "local"
});
4.2 登录方式
详情参考 https://docs.cloudbase.net/authentication/method/anonymous
五、CloudBase Framework一体化部署(推荐方式)
文档地址 https://docs.cloudbase.net/framework/index
CloudBase Framework 是云开发官方出品的云原生一体化部署工具,可以帮助开发者将静态网站、后端服务和小程序等应用,一键部署到云开发 Serverless 架构的云平台上,自动伸缩且无需关心运维,聚焦应用本身,无需关心底层配置和资源。
5.1 云开发应用介绍
云开发应用可以理解为运行在云开发环境的应用,例如一个包含前后端、数据库等能力等服务,可以通过一键部署,直接部署在云开发环境中,使用云开发底层的各项 Serverless 资源,享受弹性免运维的优势。
一个云开发应用可以拆解为三个部分,包括代码、声明式配置和环境变量信息。
5.2 cloudbase framework配置文件
在使用 CloudBase Framework 之前,您需要需要创建一个
cloudbaserc.json
配置文件,cloudbaserc.json
文件是 CloudBase CLI 、CloudBase VSCode 插件和 CloudBase 应用的配置文件,配置文件会关系到云开发如何构建和部署您的应用。
默认情况下,使用 cloudbase init
初始化项目时,会生成 cloudbaserc.json
文件作为配置文件,您也可以使用 --config-file
指定其他文件作为配置文件,文件必须满足格式要求。
CloudBase Framework 配置文件包含以下几类配置信息:
plugins:描述您的应用依赖哪些 CloudBase Framework 插件,以便根据配置来构建和部署您的应用,应用可以使用多个插件,具体插件配置方式参考下文。
目前支持的插件名称请参阅 https://github.com/Tencent/cloudbase-framework#目前支持的插件列表
示例
代码语言:javascript复制{
"framework": {
"plugins": {
"client": {
// 使用的插件 npm 包名,例如 @cloudbase/framework-plugin-website支持指定插件版本,例如@cloudbase/framework-plugin-website@1.3.5
"use": "@cloudbase/framework-plugin-website",
// 插件入参配置,不同的插件,支持的入参不同,请查阅对应插件的 README 或者文档
"inputs": {
"buildCommand": "npm run build",
"outputPath": "dist",
"cloudPath": "/vue"
}
},
"server": {
"use": "@cloudbase/framework-plugin-function",
"inputs": {
"functionRootPath": "cloudfunctions",
"functions": [{
"name": "vue-echo"
}]
}
}
}
}
}
- 生命周期
代码语言:javascript复制配置在构建部署生命周期前后,需要执行的自定义动作
{
"framework": {
"hooks": {
// 前置钩子,在执行 Framework 完整的构建部署动作之前执行的钩子,可以执行一些命令行命令
"preDeploy": {
// 前置钩子的类型,目前仅支持 execCommand,表示执行命令行命令
"type": "execCommand",
"commands": [// 要执行的 command 命令列表
"sudo npm install -g lerna",
"lerna bootstrap"
]
},
//后置钩子,在执行 Framework 部署之后,在云端调用的钩子,可以调用一些云函数
"postDeploy": {
// 后置钩子钩子的类型,目前仅支持 callFunction 代表在云端执行云函数
"type": "callFunction",
"functions":[ // 要调用的云函数列表,支持数组,例如
{
"functionName": "echo", // 调用的云函数的函数名
"params": { // 调用云函数的参数信息
"foo": "bar"
}
}
]
}
}
}
}
- 应用依赖
代码语言:javascript复制在云端一键部署场景下,您需要完善应用依赖配置来声明应用依赖的扩展资源和环境变量参数
"framework": {
// 描述项目通过控制台一键安装部署时依赖的其他资源信息、环境变量等业务参数。
"requirement": {
// 应用部署过程中用到的外部云上资源,包括 cfs、cynosdb、redis 等
"addons": [
{
"type": "CynosDB",// 资源类型,目前支持 CFS 和 CynosDB
"name": "wordpress",// 资源名称,只支持 a-z 0-9 和 -
"envMap": {// 环境变量映射文件,会将云资源产生的 IP 、PORT 通过右侧定义的名称来映射为对应的环境变量名称,并注入环境变
"IP": "WORDPRESS-IP",
"PORT": "WORDPRESS-PORT",
"USERNAME": "WORDPRESS-USERNAME",
"PASSWORD": "WORDPRESS-PASSWORD"
}
}
],
// 应用在构建时和运行时的环境变量配置声明,默认注入计算环境中(云函数、云应用),也会在云端构建时作为构建部署的环境变量,可以在 cloudbaserc.json 中通过 {{env.ENV_NAME}}引用
"environment": {
"SECRET_TOKEN": {
// 环境变量描述,会在输入时进行提示
"description": "A secret key for verifying the integrity of signed cookies.",
"required": true, //是否必填
"default": "default_value",
"validation": {// 校验规则配置
"rule": {//校验规则信息
"type": "RegExp",//校验规则类型,目前支持"RegExp" 代表正则类型
"pattern": "[3-9]",//正则的 Pattern
"flag": "g"//正则的 Flag
},
"errorMessage": "数值范围3-9"//校验失败时的错误信息
}
}
}
}
}
}
- 模板变量
配置文件支持动态变量的特性。在 cloudbaserc.json
中声明 "version": "2.0"
即可启用。
动态变量特性允许
cloudbaserc.json
配置文件中使用动态变量,从环境变量中获取动态的数据。使用{}
包围的值定义为动态变量,可以引用数据源中的值。例如`{env.ENV_ID}:
- 第一步:在项目根目录下创建
cloudbaserc.json
和.env
文件
.
├─cloudbaserc.json
├─.env
- 第二步:在 .env 文件内添加变量
ENV_ID=pro-123
DB_NAME=pro_user
- 第三步:在
cloudbaserc.json
文件内通过env
注入模板变量
{
"version": "2.0",
"envId": "{{env.ENV_ID}}",
"framework": {
"name": "node-capp",
"plugins": {
"node": {
"use": "@cloudbase/framework-plugin-node",
"inputs": {
"name": "node-capp",
"path": "/node-capp",
"platform": "container",
"containerOptions": {
"envVariables": {
"env": "{{env.ENV_ID}}",
"db": "{{env.DB_NAME}}"
}
}
}
}
}
}
}
- 第四步:一键部署应用
tcb framework deploy
- 模式切换
假设你已经完成了以上模板变量的配置
- 第一步:在项目根目录额外添加
.env.dev
文件
.
├─cloudbaserc.json
├─.env
├─.env.dev
- 第二步:在
.env.dev
文件添加变量
ENV_ID=dev-123
DB_NAME=dev_user
- 第三步:部署应用时使用 --mode 指定模式
cloudbase framework deploy --mode dev
完整示例
代码语言:javascript复制// https://docs.cloudbase.net/framework/config
{
"version": "2.0",
"envId": "{{env.ENV_ID}}",
"$schema": "https://framework-1258016615.tcloudbaseapp.com/schema/latest.json",
"framework": {
"plugins": {
"admin": {
"use": "@cloudbase/framework-plugin-website",
"inputs": {
"outputPath": "./packages/admin/dist",
"installCommand": "echo "Skip Install"",
"buildCommand": "npm run build",
"cloudPath": "{{env.deployPath}}"
}
},
"init": {
"use": "@cloudbase/framework-plugin-function",
"inputs": {
"functionRootPath": "./packages",
"functions": [
{
"name": "cms-init",
"timeout": 60,
"envVariables": {
"CMS_ADMIN_USER_NAME": "{{env.administratorName}}",
"CMS_ADMIN_PASS_WORD": "{{env.administratorPassword}}",
"CMS_OPERATOR_USER_NAME": "{{env.operatorName}}",
"CMS_OPERATOR_PASS_WORD": "{{env.operatorPassword}}",
"CMS_DEPLOY_PATH": "{{env.deployPath}}",
"ACCESS_DOMAIN": "{{env.accessDomain}}"
},
"installDependency": true,
"handler": "index.main"
}
]
}
},
"service": {
"use": "@cloudbase/framework-plugin-node",
"inputs": {
"name": "tcb-ext-cms-service",
"entry": "app.js",
"projectPath": "./packages/service",
"path": "/tcb-ext-cms-service",
"functionOptions": {
"timeout": 15,
"envVariables": {
"NODE_ENV": "production"
}
}
}
},
"db": {
"use": "@cloudbase/framework-plugin-database",
"inputs": {
"collections": [
{
"collectionName": "tcb-ext-cms-projects",
"description": "CMS 系统项目数据(请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-schemas",
"description": "CMS 系统内容模型数据(请不需要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-users",
"description": "CMS 系统系统用户数据,存储 CMS 的用户信息,包括管理员账号信息,角色信息等(请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-webhooks",
"description": "CMS 系统系统 webhook 集合,存储 CMS 系统的回调接口配置,CMS 系统数据的变更可以通过回调来进行同步 (请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-settings",
"description": "CMS 系统系统配置集合,存储 CMS 系统的设置(请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-user-roles",
"description": "CMS 系统系统用户角色配置集合,存储 CMS 系统的自定义用户角色信息(请不要手动修改)",
"aclTag": "ADMINONLY"
}
]
}
}
},
"requirement": {
"addons": [],
"environment": {
"administratorName": {
"description": "管理员账户名,账号名长度需要大于 4 位,支持字母和数字",
"required": true,
"default": "admin",
"validation": {
"rule": {
"type": "RegExp",
"pattern": "[^[a-zA-Z0-9] [a-zA-Z0-9_-]?[a-zA-Z0-9] $]",
"flag": "g"
},
"errorMessage": "字母和数字的组合,不能为纯数字,长度范围是 1 ~ 32"
}
}
}
}
}
}
其他项目配置文件示例
代码语言:javascript复制// https://docs.cloudbase.net/framework/config
{
"version": "2.0",
"envId": "{{env.ENV_ID}}",
"$schema": "https://framework-1258016615.tcloudbaseapp.com/schema/latest.json",
"framework": {
"plugins": {
"admin": {
"use": "@cloudbase/framework-plugin-website",
"inputs": {
"outputPath": "./packages/admin/dist",
"installCommand": "echo "Skip Install"",
"buildCommand": "npm run build",
"cloudPath": "{{env.deployPath}}"
}
},
"init": {
"use": "@cloudbase/framework-plugin-function",
"inputs": {
"functionRootPath": "./packages",
"functions": [
{
"name": "cms-init",
"timeout": 60,
"envVariables": {
"CMS_ADMIN_USER_NAME": "{{env.administratorName}}",
"CMS_ADMIN_PASS_WORD": "{{env.administratorPassword}}",
"CMS_OPERATOR_USER_NAME": "{{env.operatorName}}",
"CMS_OPERATOR_PASS_WORD": "{{env.operatorPassword}}",
"CMS_DEPLOY_PATH": "{{env.deployPath}}",
"ACCESS_DOMAIN": "{{env.accessDomain}}"
},
"installDependency": true,
"handler": "index.main"
}
]
}
},
"service": {
"use": "@cloudbase/framework-plugin-node",
"inputs": {
"name": "tcb-ext-cms-service",
"entry": "app.js",
"projectPath": "./packages/service",
"path": "/tcb-ext-cms-service",
"functionOptions": {
"timeout": 15,
"envVariables": {
"NODE_ENV": "production"
}
}
}
},
"db": {
"use": "@cloudbase/framework-plugin-database",
"inputs": {
"collections": [
{
"collectionName": "tcb-ext-cms-projects",
"description": "CMS 系统项目数据(请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-schemas",
"description": "CMS 系统内容模型数据(请不需要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-users",
"description": "CMS 系统系统用户数据,存储 CMS 的用户信息,包括管理员账号信息,角色信息等(请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-webhooks",
"description": "CMS 系统系统 webhook 集合,存储 CMS 系统的回调接口配置,CMS 系统数据的变更可以通过回调来进行同步 (请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-settings",
"description": "CMS 系统系统配置集合,存储 CMS 系统的设置(请不要手动修改)",
"aclTag": "ADMINONLY"
},
{
"collectionName": "tcb-ext-cms-user-roles",
"description": "CMS 系统系统用户角色配置集合,存储 CMS 系统的自定义用户角色信息(请不要手动修改)",
"aclTag": "ADMINONLY"
}
]
}
}
},
"requirement": {
"addons": [],
"environment": {
"administratorName": {
"description": "管理员账户名,账号名长度需要大于 4 位,支持字母和数字",
"required": true,
"default": "admin",
"validation": {
"rule": {
"type": "RegExp",
"pattern": "[^[a-zA-Z0-9] [a-zA-Z0-9_-]?[a-zA-Z0-9] $]",
"flag": "g"
},
"errorMessage": "字母和数字的组合,不能为纯数字,长度范围是 1 ~ 32"
}
}
}
}
}
}
5.3 插件
插件可以处理应用中的一些独立单元的构建、部署、开发、调试等流程。例如 website 插件可以处理静态网站等单元,node 插件可以处理 koa 、express 等 node 应用。
插件的配置写在 cloudbaserc.json 文件中,具体请参考配置说明中的 插件配置可以手动填写,也可以自动生成。
自动检测生成插件配置
可以在项目目录下直接运行 cloudbase
命令进行自动检测生成插件配置文件并部署
cloudbase
✔ 是否使用云开发部署当前项目 <Projects/test/test-vue> ? (Y/n) · true
✔ 选择关联环境 · webpage - [webpage:按量计费]
______ __ __ ____
/ ____// /____ __ __ ____/ // __ ) ____ _ _____ ___
/ / / // __ / / / // __ // __ |/ __ `// ___// _
/ /___ / // /_/ // /_/ // /_/ // /_/ // /_/ /(__ )/ __/
_____________/ __,_/ __,_//_____/ __,_//____/ ___/ __
/ ____/_____ ____ _ ____ ___ ___ _ __ ____ _____ / /__
/ /_ / ___// __ `// __ `__ / _ | | /| / // __ / ___// //_/
/ __/ / / / /_/ // / / / / // __/| |/ |/ // /_/ // / / ,<
/_/ /_/ __,_//_/ /_/ /_/ ___/ |__/|__/ ____//_/ /_/|_|
CloudBase Framework info Version v1.2.10
CloudBase Framework info Github: https://github.com/Tencent/cloudbase-framework
CloudBase Framework info EnvId webpage
? 检测到当前项目包含 Vue.js 项目