本地环境及开发工具
腾讯提供了云开发的开发工具,访问 云开发文档,找到并打开工具插件中的 CloudBase CLI。
CloudBase CLI 是云开发(Tencent CloudBase,TCB)开源的命令行界面交互工具,用于帮助用户快速、方便的部署项目,管理云开发资源。
CloudBase CLI 是基于 Node.js 开发的工具。
安装和登录
# 安装
npm i -g @cloudbase/cli
# 输出版本号,测试安装是否成功
tcb v
# 查看所有命令
tcb -h
每个云环境都是和账户进行绑定了,所以在使用之前,要先进行授权登录:
# 命令执行后会自动打开浏览器,对 CLI 工具进行授权
tcb login
初始化云开发项目
本地只能创建云函数,而不能创建应用(或环境),选择“创建新环境”会自动打开浏览器,访问创建应用页面。
# 创建免费环境(由于上面已经创建了 mycloudes 免费环境,达到了免费环境数量上限,所以不能再创建新的免费环境了)
# tcb env create envName
# 通过 CLI 创建项目
tcb new
√ 请选择环境所在地域 · 广州
√ 请选择关联环境 · mycloudes - [mycloudes-7g8wlhkr324798db:按量计费]
√ 请选择应用模板 · Node.js 云函数示例
√ 请输入项目名称 · nihao
√ 创建应用成功!
i 👉 开发完成后,执行命令 tcb 一键部署
注意:这里输入的项目名称是项目模板文件所在的目录名称,不是云函数的名称。并且这个项目还没有上限运行,命令行最后也给出了提示“开发完成后,执行命令 tcb 一键部署”。
项目模板目录如下:
nihao
├─ functions # 存放云函数的目录以及代码
│ └─ node-app # 云函数的目录,这个才是云函数的名字
│ ├─ index.js # 云函数入口文件
│ └─ package.json
├─ .editorconfig # 编辑器配置文件
├─ .gitignore # git 忽略列表文件
├─ cloudbaserc.json # 本地控制云函数的配置文件
├─ package.json
└─ README.md
部署
修改云函数的入口文件:
// nihao\functions\node-app\index.js
// 返回输入参数
exports.main = async (event) => {
// console.log('Hello World')
// return event
return 'Hello World & nihao'
}
部署云函数到云端环境:
# 切换到项目目录下
cd nihao
# 执行部署命令,对项目和环境进行打包上传
tcb
关于本地云函数的配置在 cloudbaserc.json
文件中:
{
...
"functions": [
{
"name": "node-app", // 云函数名称,如要修改,也要同步修改文件夹名称
"timeout": 5,
"envVariables": {},
"runtime": "Nodejs10.15", // 运行环境
"memorySize": 128, // 最大可分配的函数内存
"handler": "index.main" // 入口文件.入口函数
}
],
...
}
创建触发器(HTTP 访问服务)
tcb service create
√ 请选择创建HTTP 访问服务的云函数 · node-app
√ 请输入HTTP 访问服务路径 · app
√ HTTP 访问服务创建成功!
点击访问> https://mycloudes-xxx-xxx.ap-guangzhou.app.tcloudbase.com/app
命令行创建 HTTP 访问服务后同样要等待几分钟才能完成。
触发器创建成功后,访问触发器地址,页面输出 Hello World & nihao
。
更新云函数代码
修改云函数返回值:
// nihao\functions\node-app\index.js
// 返回输入参数
exports.main = async (event) => {
// console.log('Hello World')
// return event
return 'Hello World & nihao & again'
}
# 执行命令(在项目目录下执行)
tcb fn code update node-app
使用 tcb
会重新更新部署整个项目,可以使用 tcb fn code update <云函数名称>
仅更新单个云函数的代码和执行入口,不更新函数的其它配置,这样会快很多。
**注意:**更新命令的前提,是要先将云函数部署到云平台,之后才能使用,部署单个云函数命令:tcb fn depoly <云函数名称>
注意:tcb fn code update <云函数名称>
只是更新代码(云函数目录下的所有文件,包括 node_modules
),所以这个操作会清除云平台上的全部旧文件,且不会执行安装依赖操作。所以如果云函数使用了依赖,但本地没有安装依赖(生成 node_modules
),这个命令会导致安装的依赖丢失。可以使用部署命令(tcb fn depoly <云函数名称>
)重新部署,默认的配置会执行安装依赖。最好的方式就是在本地也安装依赖,这样只是用更新命令即可。
本地测试工具
虽然代码放在了本地编写,但是本地是没有触发器的,当然本地有 Node 环境,但是与云环境还是有很大差异的,开发者不能每次写完代码,都需要上传再测试。
为了解决这个问题,腾讯开发了开源的 SCF CLI 工具(Serverless Cloud Function CLI),它可以帮助我们在本地快速调试,基本原理就是在本地开启一个服务器模拟云环境,让我们可以在本地进行调试。
# 安装
npm install scf-cli -g
# 查看版本号检查安装是否成功
scf --version
# 使用
scf init
? 请输入入口文件地址(相对路径) ./functions/node-app # 注意此地址是入口文件的目录,而不是入口文件
? 请输入入口执行方法名称 main
? 请输入超时时间限制(单位:s) 3
? 请选择测试模版 http
# 启动完成后默认监听 3000 端口
[Weapp CLI][2022-05-24T16:09:34+08:00] Server has listened [IP]:localhost [PORT]:3000. http://localhost:3000
浏览器访问 http://localhost:3000
可以看到正确的响应。
Express 与云函数
经过前面一系列的配置,终于可以在本地开发调试了,但是,使用纯原生的 Node.js 开发,效率是非常低的,所以下面将在云函数中引入一款我们熟悉的后端开发框架:Express。
安装 Express 的目录是云函数的所在目录:
cd .\functions\node-app
npm i express
创建 app.js
:
// nihao\functions\node-app\app.js
const express = require('express')
const app = express()
app.use('/users', (req, res) => {
res.send('users')
})
module.exports = app
接着创建一个启动文件 www.js
:
// nihao\functions\node-app\www.js
const app = require('./app')
app.listen(3000, () => {
console.log('http://localhost:3000')
})
接着启动 express:
注意:如果 SCF CLI 还在启动,需要将其关闭,因为它也占用了 3000 端口。
nodemon www.js
访问 http://localhost:3000/users
查看是否成功。
在云函数中,我们知道,代码是在入口函数中运行的,而云函数中有 HTTP 触发器,是不需要我们创建服务的,而上面使用 Express,必须要我们自己创建一个启动文件(www.js
),这就造成了一个矛盾,就是在本地使用 Express,用户是先来请求 Express 创建好的 HTTP 服务,然后 Express 再去调用写好的路由规则,处理请求作出响应。
但是在云服务中是用户先去请求云环境的 HTTP 触发器,由触发器调用云函数(Cloud Functions),云函数里面才是接收的请求以及响应的代码。
也就是说中间这层需要为 HTTP 触发器和函数开通一个入口的,而本地启动的服务器在云函数中是不需要的,那我们如何解决这个问题呢?
有一款开源的工具 serverless-http,专门用来在 Serverless 包装 API,不需要服务器,也不需要端口的监听。
# 安装
npm i serverless-http
修改入口函数:
// nihao\functions\node-app\index.js
const serverless = require('serverless-http')
const app = require('./app')
const handler = serverless(app)
exports.main = async (event, context) => {
const res = await handler(event, context)
return res
}
重新部署云函数:
# 注意需要回到项目目录执行部署命令(nihao)
tcb
部署完成后,去控制台查看代码是否更新:
访问触发器,并拼接路由地址:https://<默认域名>/app/users
,页面输出 users
。
修改路由响应:
// nihao\functions\node-app\app.js
const express = require('express')
const app = express()
app.use('/users', (req, res) => {
res.send('users again')
})
module.exports = app
更新函数代码:
tcb fn code update node-app
重新访问,页面输出 users again
。
同样的,在本地启动 Express:
# 在 node-app 目录下执行
nodemon www.js
访问 http://localhost:3000/users
也能正常显示响应内容。
现在就可以在线下进行本地开发,开发完成后通过 tcb
命令进行线上部署了。
本地开发测试,只需要开启本地服务器就可以了。