Serverless 学习 02 本地环境及开发工具、本地测试工具、Express 与云函数

本地环境及开发工具

腾讯提供了云开发的开发工具,访问 云开发文档,找到并打开工具插件中的 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 命令进行线上部署了。

本地开发测试,只需要开启本地服务器就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值