跳到主要内容

如何调用TCB云开发的其他能力

如 TCB云函数环境中运行的 函数代码 一样,可以在函数式托管环境中使用 @cloudbase/node 调用 TCB的其他能力,如数据库、存储等,当然也可以调用云函数。

因 函数式托管 同 TCB云函数 运行式环境存在一定的差异,@cloudbase/node 在使用上存在细微差异,在 SDK 的初始化时,需要传入 context 参数,如下所示:

import { TcbEventFunction } from '@cloudbase/functions-typings'

export const main: TcbEventFunction<void, string> = function(event, context) {
// 注意:因依赖 context 参数,所以必须放在 `main` 函数内部
const tcbapp = tcb.init({
context: context,
env: 'abc-xyz', // 指定调用的环境Id,如果不传 `env` 则调用当前环境
})

tcbapp.uploadFile({cloudPath: '', fileContent: Buffer.from('')})
// ...

return 'done'
}

传入 context 参数后,@cloudbase/node 即可调用 TCB云开发的相关能力。

注意:该能力目前需要申请开通后才能使用,如需开通请联系腾讯云技术支持。

完整示例代码

import { TcbEventFunction } from '@cloudbase/functions-typings'
import tcb from '@cloudbase/node-sdk'

async function sleep (time: number) {
return await new Promise(resolve => {
setTimeout(() => {
resolve(undefined)
}, time)
})
}

async function uploadFile (tcbapp: tcb.CloudBase) {
const result = await tcbapp.uploadFile({
cloudPath: ' hello world 你好 世界 .png',
fileContent: Buffer.from(' hello world 你好 世界 ')
})

return await tcbapp.getTempFileURL({ fileList: [result.fileID] })
}

async function runCmdWithCloudbaseNodeSDK (tcbapp: tcb.CloudBase) {
const result = await tcbapp
.database()
.collection('articles')
.where({
_id: 'not-exists-id'
})
.options({ multiple: true })
.update({
'a.b.c': 'a.b.c'
})

return result
}

export const main: TcbEventFunction<void, string> = function(event, context) {
console.log({ event, context })

const tcbapp = tcb.init({
context
})

// 调用 云函数
try {
const result = await tcbapp.callFunction({
name: 'test',
data: { a: 1 }
})
console.log(result)
} catch (e) {
console.error(e, 'callFunction.error')
return e
}

// 上传文件
try {
const result = await uploadFile(tcbapp)
console.log(result, 'uploadFile.result')
} catch (e) {
console.error(e, 'uploadFile.error')
return e
}

// 调用数据库
try {
const result = await Promise.all([
runCmdWithCloudbaseNodeSDK(tcbapp)
])
console.log(result, 'run.result')
} catch (e) {
console.error(e, 'e')
return e
}

await sleep(3)

return 'done'
}