收藏
回答

云函数调用数据库后返回小程序的result为null

云函数:

exports.main = async (event, context) => new Promise((resolve, reject) => {
  db.collection('cardList').add({
    data: {
      name : 'name'
    },
    success: function () {
      resolve({status : 1})
    }
  });
})

小程序:

wx.cloud.callFunction({
      name: 'addCard',
      data: {
        name : 'name'
      },
      complete: res => {
        console.log('callFunction test result: ', res)
      },
      success  : res => {
        console.log(res)
      }
    })

小程序中打印出来的是:

{errMsg: "cloud.callFunction:ok", result: null, requestID: "e474bbe7-10e1-11e9-9884-525400192d0e"}


请问result为何返回的是 {status : 1}


但是官网的例子是可以输出的值

exports.main = (event, context) => new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(3333)
    }, 3000)
  })


{errMsg: "cloud.callFunction:ok", result: 3333, requestID: "e474bbe7-10e1-11e9-9884-525400192d0e"}

最后一次编辑于  2019-01-06
回答关注问题邀请回答
收藏

4 个回答

  • 彭辛乾
    彭辛乾
    2020-03-23
    // 云函数入口函数
    exports.main = async (event, context) => {
      const wxContext = cloud.getWXContext()
      const db = cloud.database()
      const _ = db.command
      const $ = db.command.aggregate
    
    
      /**
       * customers表和record表作连接
       * @see https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/async.html
       * 需要异步返回数据,否则返回的数据为null
       */
      console.log('调用云函数查询设备信息(ID列表):' + event.deviceId)
      return new Promise((resolve , reject) => {
        db.collection('customers')
        .aggregate()
        .match({
          _id:_.in(event.deviceId)
        })
        .lookup({
          from:'record',
          let:{
            customersId:'$_id'
          },
          pipeline:$.pipeline()
          .match(_.expr($.eq(['$uid','$$customersId'])))
          .sort({
            record_time:-1
          })
          .limit(12)
          .done(),
          as'recordList'
        })
        .end()
        .then(res => {
          console.log("返回结果列表:")
          console.log(res.list)
          // 通过resolve()返回结果
          resolve(res)
        })
        .catch(err => reject(err))
      })
    }
    
    
    //调用端
    wx.cloud.callFunction({
          name:'getDeviceInfo',
          data:{
            'deviceId':deviceId
          },
          success:function(res){
            wx.showToast({
              title: '更新成功',
              icon:'success',
            })
            console.log(res)
          },
          faile:function(res){
       
          }
        })
    
    
    
    
    
    

    @see https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/async.html

    2020-03-23
    有用 1
    回复
  • 威
    2019-10-21

    云函数处理数据库并根据处理结果返回前端:

    exports.main = async (event, context) => {
      const wxContext = cloud.getWXContext()
      try {
        let res =  await db.collection('tb_user').add({
          data: {
            openid: wxContext.OPENID,
            appid: wxContext.APPID,
            unionid: wxContext.UNIONID
          }
        })
        var code = 0
        var msg = 'success'
        if (res.errMsg != 'collection.add:ok') {
          code = 1
          msg = 'error'
        }
        return {
          code: code,
          msg: msg,
          data: {
            openid: wxContext.OPENID,
            appid: wxContext.APPID,
            unionid: wxContext.UNIONID,
            env: wxContext.ENV
          }
        }
      } catch (e) {
        console.error('err:',e)
        return {
          code: e.errCode,
          msg: 'error'
        }
      }
    }


    2019-10-21
    有用 1
    回复
  • 半寸灰
    半寸灰
    2019-01-07


    这样


    exports.main = async (event, context) => {  


     

    return await db.collection('cardList').add({      

         data: {        

            name: 'name',        

            }

       })

     


    }


    2019-01-07
    有用
    回复 1
    • 杨QD
      杨QD
      2019-08-29
      我这么写也是返回null的值怎么半
      2019-08-29
      回复
  • 海玄科技
    海玄科技
    2019-01-05

    马上学习了一下 Promise  

    https://segmentfault.com/a/1190000007032448


    Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。

    这两个函数就是就是「回调函数」,由JavaScript引擎提供。

    resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去; reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。


    resolve传递出去的结果,外部函数并没有 接收到吧?

    不知道我加个 return 对不对

    exports.main = async (event, context) => return new Promise((resolve, reject) => {})

    2019-01-05
    有用
    回复 5
    • CZL
      CZL
      2019-01-06

      哥你这写法就有问题

      2019-01-06
      回复
    • 海玄科技
      海玄科技
      2019-01-06回复CZL

      哎呀!露怯了!

      2019-01-06
      回复
    • 海玄科技
      海玄科技
      2019-01-06

      本来以为我的锅!


      赶紧测试一下。


      然后,我要跟你杠精一下。



      exports.main = async (event, context) => {

         return new Promise((resolve, reject) => {})

      }


      这段代码,绝对没语法错误。


      你的 async(event,context) = > 这个后面少个 { } 中括号

      你不写 return ,肯定是null


      也不知道你是测试我的代码后错误,就来杠我,

      还是测都没测就来杠我!


      2019-01-06
      回复
    • CZL
      CZL
      2019-01-06

      哥你本来回复我的代码里就 是 async(event,context) = > 这个后面少个 { } 中括号

      2019-01-06
      回复
    • 海玄科技
      海玄科技
      2019-01-07回复CZL

      我是直接从你帖子里复制的。


      你是要杠嘛?


      也不说说后来如何?


      算了,不值得!交流!

      2019-01-07
      回复
登录 后发表内容