收藏
回答

关于云函数使用tcbRouter后async/await与Promise.all() 一起用的问题?

改了很多次,一直再报这个错{"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"Unexpected identifier"},请大家帮我看看。

// 云函数入口文件
const cloud = require('wx-server-sdk')


cloud.init()
const tcbRouter = require('tcb-router')
const db = cloud.database()


// 云函数入口函数
exports.main = async(event, context) => {
  const wxContext = cloud.getWXContext()


  //event中包含前端调用传过来的收藏状态、当前物品收藏信息
  const app = new tcbRouter({
    event
  })


  //在收藏列表页增删收藏记录,同时更新物品收藏数量
  app.router('cancelOrAgainShouCang', async(ctx, next) => {
    let cancelShouCangStatus = ''  //保存取消收藏是否成功
    let againShouCangStatus = ''   //保存再次收藏是否成功
    let promiseArray=[]  //存放promise对象的数组
    let p1,p2 


    //当前是已收藏状态,进行取消收藏逻辑操作,将对收藏集合、物品信息集合的数据库操作封装为promise对象
    if (event.shouCangStatus) {
       p1=new Promise((resolve,reject)=>{
       db.collection('shouCang-users').where({
          _openid: wxContext.OPENID,
          goodsId: event.currentShouCangInfo.goodsId
        }).remove().then((res)=>{
          resolve('deleteShouCangRecordSuccess')
        }).catch((err)=>{
          reject()
        })
      })


      p2=new Promise((resolve,reject)=>{
        db.collection('publish-goods-info').where({
          _id: event.currentShouCangInfo.goodsId
        }).update({
          data:{
            shouCangCounts: db.command.inc(-1)
          }
        }).then((res)=>{
          resolve('decreaseShouCangCountsSuccess')
        }).catch((err)=>{
          reject()
        })


        //使用Promise.all来执行之前封装的两个promise对象,返回执行成功的状态信息
        promiseArray=[p1,p2]
        cancelShouCangStatus=await Promise.all(promiseArray).then((res)=>{
          return 'cancelShouCangSuccess'
        }).catch((err) => {
          console.log(err)
        })
      })
    } 
    
    //当前是未收藏状态,进行再次收藏逻辑操作,将对收藏集合、物品信息集合的数据库操作封装为promise对象
    else {  
      p1=new Promise((resolve,reject)=>{
        db.collection('shouCang-users').add({
          data: {
            _openid: event.currentShouCangInfo._openid,
            goodsId: event.currentShouCangInfo.goodsId,
            shouCangTime: db.serverDate(),
            totalCategory: event.currentShouCangInfo.totalCategory,
            shouCangOfGoodsInfo: event.currentShouCangInfo.shouCangOfGoodsInfo
          }
        }).then((res) => {
          resolve('addShouCangCountsSuccess')
        }).catch((err)=>{
          reject()
        })
      })


      p2=new Promise((resolve,reject)=>{
        db.collection('publish-goods-info').where({
          _id: event.currentShouCangInfo.goodsId
        }).update({
          data:{
            shouCangCounts: db.command.inc(1)
          }
        }).then((res)=>{
          resolve('increaseShouCangCountsSuccess')
        }).catch((err)=>{
          reject()
        })
      })


      //使用Promise.all来执行之前封装的两个promise对象,返回执行成功的状态信息
      promiseArray=[p1,p2]
      againShouCangStatus=await Promise.all(promiseArray).then((res)=>{
        return 'againShouCangSuccess'
      }).catch((err)=>{
        console.log(err)
      })
    }


    //返回以上操作是否成功的状态信息
    ctx.body={
      cancelShouCangStatus,
      againShouCangStatus
    }
  })




  return app.serve()
}
回答关注问题邀请回答
收藏

1 个回答

  • 老张
    老张
    02-05

    弃用tcbRouter。

    02-05
    赞同 1
    回复 3
    • 峯
      02-05
      谢谢你的回复。我需要用到tcbRouter来优化路由,不然云函数会不够用的;我没用promise.all,直接同步执行的每个数据库操作,这样只是没那么高效了,然后可以了。
      02-05
      回复
    • 老张
      老张
      02-05回复
      不敢保证tcbRouter会及时升级;自己写个switch或者if esle来代替tcbRouter得了。
      02-05
      回复
    • 峯
      02-06回复老张
      嗯嗯
      02-06
      回复
登录 后发表内容
问题标签