Cloud.callFunction(object: Object): Promise<Object>

支持端:小程序 , 云函数

调用云函数

参数

object: Object

属性类型默认值必填说明
namestring云函数名
dataObject传递给云函数的参数,在云函数中可通过 event 参数获取
configObject配置

object.config 的结构

属性类型默认值必填说明
envstring环境 ID,填写后将忽略 init 时指定的环境 ID

返回值

Promise.<Object>

属性类型说明
resultany云函数返回的结果
requestIDstring云函数执行 ID,可用于日志查询

data 参数说明

data 中如果传入了 Buffer 类型的数据,数据在 JSON 序列化的过程中会被转成 { "type": "Buffer", data: number[] } 的格式,以小程序端调用为例:

  1. // 小程序端调用
  2. wx.cloud.callFunction({
  3. // ...
  4. data: {
  5. buf: ArrayBuffer // 此处填入了某种方式获取得到的 Buffer 数据,可以是 request 下来的,可以是读文件读出来的等等
  6. },
  7. })
  8. // 云函数端收到的 event 参数的结构:
  9. {
  10. "type": "Buffer",
  11. "data": [ 17, 371, 255, ... ] // Uint8 Array
  12. }

因此应当避免传入 Buffer 类型的数据,因为会让数据体积增大,增加传输耗时,如果需要传递 Buffer,有两种替代的建议方式:

  • Buffer 较大,可先上传至文件存储空间,然后调用云函数的时候传递 fileID / 文件 URL 而不是 Buffer,再在云函数中下载下来
  • Buffer 非常小 (如 < 10k),可将 Buffer 转成 base64 再调用

示例代码

假设已有一个云函数 add

  1. exports.add = (event, context, cb) => {
  2. return event.x + event.y
  3. }

在小程序端发起对云函数 add 的调用:

  1. wx.cloud.callFunction({
  2. // 要调用的云函数名称
  3. name: 'add',
  4. // 传递给云函数的event参数
  5. data: {
  6. x: 1,
  7. y: 2,
  8. }
  9. }).then(res => {
  10. // output: res.result === 3
  11. }).catch(err => {
  12. // handle error
  13. })

在云函数端任意云函数发起对云函数 add 的调用(完整云函数代码示例):

  1. const cloud = require('wx-server-sdk')
  2. cloud.init({
  3. env: cloud.DYNAMIC_CURRENT_ENV
  4. })
  5. exports.main = async (event, context) => {
  6. const res = await cloud.callFunction({
  7. // 要调用的云函数名称
  8. name: 'add',
  9. // 传递给云函数的参数
  10. data: {
  11. x: 1,
  12. y: 2,
  13. }
  14. })
  15. // 3
  16. return res.result
  17. }

小程序端 callback 风格调用

小程序端同时支持 Callback 风格调用,如上 Promise 风格的调用可以用 Callback 风格改写:

  1. wx.cloud.callFunction({
  2. // 要调用的云函数名称
  3. name: 'add',
  4. // 传递给云函数的参数
  5. data: {
  6. x: 1,
  7. y: 2,
  8. },
  9. success: res => {
  10. // output: res.result === 3
  11. },
  12. fail: err => {
  13. // handle error
  14. },
  15. complete: () => {
  16. // ...
  17. }
  18. })