如何迁移云函数代码到云托管
如果需要将原有的云函数代码迁移到函数型云托管,可以参考如下内容,了解到需要做的一些变更。
函数代码编写的调整
函数入口函数差异
云函数写法:
export const main = function(event, context) {}
函数型云托管写法:
export const main = function(event, context) {}
两种函数的入口函数格式是一致的,参数内容格式存在一定差异:
event
:云函数触发时传入的事件参数,两种函数基本一致,函数型云托管
支持更多类型的入参格式context
:云函数运行时的上下文参数,两种函数完全不同
因此,如果你在云函数中使用了 context
参数,迁移到函数型云托管时可能需要进行一定的调整。
函数返回值差异
@cloudbase/node-sdk
使用差异
云函数写法:
import tcb from '@cloudbase/node-sdk'
// tcb.init 可以写在入口函数外
tcb.init({ env: 'abc-xyz' })
export const main = function(event, context) {
// tcb.init 可以写在入口函数内
const tcbapp = tcb.init({ env: 'abc-xyz' })
// ...
return 'done'
}
函数型云托管写法:
import tcb from '@cloudbase/node-sdk'
export const main = function(event, context) {
// tcb.init 需要写在入口函数内,因依赖 context 参数,所以必须放在 `main` 函数内部
const tcbapp = tcb.init({ context: context, env: 'abc-xyz' })
// ...
return 'done'
}
在函数型云托管中,tcb.init
需要传入的 context
参数获得相关信息,所以在使用时需要将 tcb.init
放在 main
函数内。
如何在函数型云托管中使用 @cloudbase/node-sdk
相关能力,可参考 如何调用TCB云开发的其他能力? 文档。
目录结构的调整
云函数代码目录结构示例:
function_nodejs /
- index.js
- package.json
函数型云托管代码目录结构示例
- 单服务内包含一个函数逻辑:
runfunction_nodejs /
- index.js
- package.json
- 单服务内包含多个函数逻辑:
runfunction_nodejs /
- cloudbase-functions.json # 多函数配置文件
- cloudrunfunctions/funcA # 函数 A 目录
- index.js
- cloudrunfunctions/funcB # 函数 B 目录
- index.mjs
- package.json # 指定 index.mjs 为入口文件
在函数型云托管中,既可以按原有函数目录方式组织代码,也可以将多个函数逻辑整合在一个云托管服务中。
在实际使用中,更加建议将多个函数整合在一个服务中。这种方式可以充分利用云托管服务的运行实例资源,降低冷启动,同时简化服务管理。
调用函数的方法调整
在小程序中调用云函数的方法示例:
wx.cloud
.callFunction({
// 云函数名称
name: "hello_world",
// 传给云函数的参数
data: {
a: 1,
b: 2,
},
})
.then((res) => {
console.log(res.result); // 3
})
.catch(console.error);
在小程序中调用函数型云托管的方法示例:
- 单服务内包含一个函数逻辑:
// 容器调用必填环境id,不能为空
const c1 = new wx.cloud.Cloud({
resourceEnv: "环境id",
});
await c1.init();
const r = await c1.callContainer({
path: "/", // 填入业务自定义路径
header: {
"X-WX-SERVICE": "xxx", // 填入服务名称
},
// 其余参数同 wx.request
method: "POST",
});
console.log(r);
- 单服务内包含多个函数逻辑:
// 调用必填环境id,不能为空
const c1 = new wx.cloud.Cloud({
resourceEnv: '环境id' //填入云开发环境 id
})
await c1.init()
const r1 = await c1.callContainer({
path: '/', // 默认函数对应的请求路径
header: {
'X-WX-SERVICE': 'testfunc2', // 填入创建时的函数名称 testfunc2
},
// 其余参数同 wx.request
method: 'GET',
})
console.log(r1) //输出 Hello world!
const r2 = await c1.callContainer({
path: '/echo', // echo 函数对应的请求路径
header: {
'X-WX-SERVICE': 'testfunc2', // 填入创建时的函数名称 testfunc2
},
// 其余参数同 wx.request
method: 'POST',
data: {
a: 1,
b: 2
}
})
console.log(r2) //输出具体请求及时间
更多的函数型云托管的调用方法可见文档。