跳到主要内容

Web 云函数

Web 云函数(Web Function) 是云函数的一种函数类型,区别于 事件函数(Event Function) 对于事件格式的限制,Web 云函数可以直接接收和处理 HTTP 请求。

Web 云函数(Web Function) 相比普通函数仅需编写函数 export function main (event, context) { /* 业务逻辑 */ } 的方式,Web 云函数需要编写完整的 HTTP 服务代码,并监听 9000 端口。可以使用 Express.jsKoa.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) 有所不同,因此,云函数入参 eventcontext 以及 环境变量 是存在差异的。

更完整的示例可参考: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 必须指定,否则无法调用成功。