Web 云函数
Web 云函数(Web Function)
是云函数的一种函数类型,区别于 事件函数(Event Function)
对于事件格式的限制,Web 云函数可以直接接收和处理 HTTP 请求。
Web 云函数(Web Function)
相比普通函数仅需编写函数 export function main (event, context) { /* 业务逻辑 */ }
的方式,Web 云函数需要编写完整的 HTTP 服务代码,并监听 9000
端口。可以使用 Express.js
、Koa.js
等框架来编写 Web 云函数
。Web 云函数
本质上是一种函数形式的服务托管。
因为 Web 云函数
可以直接处理 HTTP 请求,因此,Web 云函数可以感知 HTTP 请求,支持 SSE & WebSocket,以及 文件上传、下载等能力。
Web 云函数
需要编写完整的 HTTP 服务代码,相对来说比较麻烦,通过使用 @cloudbase/functions-framework
框架,可以直接使用函数式写法实现 Web 云函数
,或者将普通函数转成 Web 云函数
以获得 Web 云函数
相关能力。
常规的 Web 云函数
= 运行环境 + 用户服务代码(Express.js/Koa.js)
,使用 @cloudbase/functions-framework
框架开发的 Web 云函数
= 运行环境 + 函数运行框架(@cloudbase/functions-framework) + 用户函数代码
。
如何编写 Web 云函数代码?
云开发 Web 云函数
可以基于 @cloudbase/functions-framework
框架进行函数代码编写,函数型托管 也基于此框架,因此编码方式类似。
以下为使用 @cloudbase/functions-framework
框架编写 Web 云函数的简单示例。包括 3 个文件:
scf_bootstrap
# 项目启动脚本文件,云函数平台通过执行该文件启动函数服务,该文件需随着代码一同打包上传到云函数。package.json
# 函数相关文件index.js
# 函数相关文件
项目文件结构与 事件函数(Event Function)
的区别在于,Web 云函数
需要编写 scf_bootstrap
启动脚本文件。
- scf_bootstrap
#!/bin/bash
node node_modules/@cloudbase/functions-framework/bin/tcb-ff.js --port=9000 --logDirname=/tmp/logs --interceptOutput=false --extendedContextKey=X-Cloudbase-Context
- package.json
{
"name": "example",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"@cloudbase/functions-framework": "^1.14.0"
}
}
- index.js
exports.main = async function main (event, context) {
// 切换到 SSE 模式
const sse = context.sse()
console.log(sse, 'sse')
sse.on('close', () => {
console.log('sse closed')
})
// 发送事件到客户端,发送前先检查是否已经关闭,如未关闭可发送
if (!sse.closed) {
sse.send({ data: 'hello from sse function, abcedfg..., €€€€€⭐⭐⭐⭐⭐' })
sse.send({ data: 'a\n\n\n\nb\r\r\r\rc\n\r\nd' })
sse.send({ data: { a: 1, b: 2, c: { a:1,b:2 } } })
sse.send({ data: JSON.stringify({ a: 1, b: 2, c: { a:1,b:2 } }) })
sse.send({ data: Buffer.from('this is a message in buffer.') })
}
console.log('function end...')
return ''
}
如上,函数代码相比 事件函数(Event Function)
的主要区别是,需要 scf_bootstrap
启动脚本,与 事件函数(Event Function)
编写方式差异不大。
注意:虽然编码方式仍然是函数式的,但是 Web 云函数
因为在运行机制上与 事件函数(Event Function)
有所不同,因此,云函数入参 event
和 context
以及 环境变量
是存在差异的。
更完整的示例可参考:https://github.com/TencentCloudBase/func-v2-template/tree/webfunc
如何调用 Web 云函数?
通过云函数的 HTTP API 调用 Web 云函数,具体可参考文档:云函数 HTTP API。
调用 Web 云函数的 HTTP API 需要携带 Authorization
头部,使用 Bearer
方式传递 Access Token
。如何获取 Access Token
可参考文档:Access Token。
调用 Web 云函数
示例:
curl -L 'https://{your-envId}.api.tcloudbasegateway.com/v1/functions/{name}?webfn=true' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
-d '{}'
注意:参数中的 webfn=true
必须指定,否则无法调用成功。