nest使用cloudbase(tcb)进行serverless开发
Tencent Cloud Base:腾讯云平台下面简称tcb
- 前置:
- 注册腾讯云
- 实名
- 开通云开发(Fass(也就是Serverless) + Bass)
这里不讲解什么是serverless,什么是Fass,什么是Bass,这种东西你去b站看个20分钟的视频比我罗里吧嗦效率高得多。
Tips:腾讯云每月都会分配一定容量免费,超过就是按量付费,这个可以自己看看
传送门:tcb免费额度和付费情况
踩坑点(如果你是看教程就先看后面)
- 一号坑:再windows环境下,
package.json
文件的script
使用环境变量报错
"scripts": {
// ...
"dev": "NODE_ENV=development nest start --watch",
// ...
}
-
解决办法:
- 全局安装
cross-env
包再将package.json
文件添加cross-env前缀
"scripts": { // ... "dev": "cross-env NODE_ENV=development nest start --watch", // ... }
- 全局安装
- 二号坑:Module ‘“buffer”’ has no exported member ‘Blob’
- 很奇怪,这明显就是
typescript
的声明文件出了问题,无非就是版本问题。 - 最后解决原址:https://github.com/DefinitelyTyped/DefinitelyTyped/issues/58445
重点:“升级@types/node(从 12.x 到 14.x)对我有用”
- 其他都对我没用,在我成功将
@types/node
锁定到14.x
版本后pnpm i
解决
"devDependencies": {
"@types/node": "^14.0.0",
}
创建环境
当你腾讯云账号有了,也开通了cloudbase
- 新建
- 创建
差不多都是右手就行的东西🐸
- 创建需要一定的时间,等一会之后就如下
- 进入界面
使用TCB Cli
基础
- 全局安装
npm i -g @cloudbase/cli
pnpm add -g @cloudbase/cli
yarn global add @cloudbase/cli
- 检测
tcb -v
- 比较重要的命令
更多配置、命令、教程参考Cloud Base官网:cloudbase cli 官网
# 登录
tcb login
# 部署
tcb fn deploy [option]
-e, --envId <envId> 环境 Id
--code-secret <codeSecret> 传入此参数将保护代码,格式为 36 位大小写字母和数字
--force 如果存在同名函数,上传后覆盖同名函数
--path <path> 自动创建HTTP 访问服务访问路径
--all 部署配置文件中的包含的全部云函数
--dir <dir> 指定云函数的文件夹路径
# 可以直接tcb fn deploy会问你是部署配置文件中的包含的全部云函数
# 查看部署的函数列表
tcb fn list
# 下载云函数
tcb fn code download <functionName> [destPath]
# 下载demo云函数路径根据cloudbaserc.json中的functionRoot参数
tcb fn code download demo
# 触发 app 函数
tcb fn invoke app
# 只更新代码部分
tcb fn code update app
配置文件
cloudbaserc.json
,tcb初始化时会创建改函数
初始化项目
# 根据提示登录
tcb login
# 因为我用官方的模板构建失败, 所以需要我们自己构建
tcb new nest-short-url
- 生成模板
踩坑点一号、二号
npm i
后你会发现跑不起来
这里最好用npm,再云函数中安装依赖就是npm,保持一致比较好
- 情况一
'NODE_ENV' is not recognized as an internal or external command,
operable program or batch file.
- 情况二
node_modules/@types/superagent/index.d.ts:23:10 - error TS2305: Module '"buffer"' has no exported member 'Blob'.
23 import { Blob } from "buffer";
~~~~
[20:47:29] Found 1 error. Watching for file changes.
以上两种情况,解决方式都参考前面的
踩坑点
标题的内容
- 解决完之后就能跑起来了
[Nest] 41044 - 2022/02/15 20:49:14 [NestFactory] Starting Nest application...
[Nest] 41044 - 2022/02/15 20:49:14 [InstanceLoader] AppModule dependencies initialized +68ms
[Nest] 41044 - 2022/02/15 20:49:14 [RoutesResolver] AppController {}: +13ms
[Nest] 41044 - 2022/02/15 20:49:14 [RouterExplorer] Mapped {, GET} route +12ms
[Nest] 41044 - 2022/02/15 20:49:14 [RouterExplorer] Mapped {/home, GET} route +2ms
[Nest] 41044 - 2022/02/15 20:49:14 [NestApplication] Nest application successfully started +8ms
App listen on http://localhost:5000
部署+依赖安装
场景:代码写完了,提交所有文件、配置文件、让云函数依赖更新
- 也就是
package.json
文件内模板作者帮我们已经完成的,直接用即可
npm run deploy
Tips:npm run deploy用到了插件,如果你不想使用默认的云函数名就去修改(相关详情查看
@cloudbase/framework-plugin-node
文档)
{
"version": "2.0",
"envId": "nest-short-url-7gcrn1kw9452ff9a",
"$schema": "https://framework-1258016615.tcloudbaseapp.com/schema/latest.json",
// 插件内容
"framework": {
"name": "nest-starter",
"plugins": {
"node": {
"use": "@cloudbase/framework-plugin-node",
"inputs": {
"name": "nest-starter",
"path": "/nest-starter",
"entry": "app.js",
"buildCommand": "npm install --prefer-offline --no-audit --progress=false && npm run build",
"functionOptions": {
"timeout": 5,
"envVariables": {
"NODE_ENV": "production"
}
}
}
}
}
},
// 下载时函数都会放进 functions文件加里
"functionRoot": "./functions",
// 更多相关配置查文档
"functions": [
{
// 普通部署时安装依赖
"installDependency": false,
// 入口文件
"entry": "app.js",
// 忽略文件
"ignore": ["*.md", "node_modules", "node_modules/**/*"]
}
],
"region": "ap-shanghai"
}
该方式因为要安装所有依赖,所以是最慢的
应用场景
:第一次提交到云函数
下载云函数代码
本应该创建的时候就执行部署nest模板 + 依赖安装的,但是既然安装失败就进行手动安装(部署 + 依赖),现在下载云函数代码才是开始
# 因为我们刚部署+安装依赖, 所以有cloudbaserc.json文件 ✔️
tcb fn code download nest-starter
# 如果是已经再云函数部署好的
# 安装到当前目录
tcb fn code download nest-starter ./
- 会多出如下文件,也就是我们刚刚部署好的
这才是我们真正开发的地方👺,整理一下,把之前的都除了
cloudbaserc.json
、package.json
都可以删了,因为之前部署+依赖安装过云函数里的package.json会被修改,用保留的替换内容后进入目录即可运行
部署
场景:代码修改了、配置文件(
cloudbaserc.json
)修改了,没有更新依赖(修改的是function/下的文件)
- 随便修改代码后,使用tcb cli快速部署
tcb fn deploy nest-starter
-all 所有函数
--force 强制覆盖同名函数
更新代码
只会更新代码(修改的是function/下的文件)
tcb fn code update nest-starter
使用vs code插件
-
搜索并安装:
Tencent CloudBase Toolkit
-
按照它的提示就能直接用了,等价于TCB cli,看个人习惯,懒人工具罢了😀
xiaoqinvar的cloudbase-nest-template
我的模板修改了以上信息,并添加了一些友好的参数和文件