收藏
回答

小程序云函数+触发器更新数据库失败(仅上传云函数后第一次调用时成功)

框架类型 问题类型 终端类型 AppID 基础库版本
小程序 Bug 客户端 wx639d6b086ad4cbc2 2.5.0

- 当前 Bug 的表现(可附上截图)


在小程序云开发中:在云函数里使用触发器更新数据库里的数据,只有上传后第一次执行成功:

云函数 getYi 的日志:

返回结果:
 
{"stats":{"updated":1},"errMsg":"document.update:ok"}


后面自动执行的都显示:

云函数 getYi 的日志:

返回结果:
 
{"stats":{"updated":0},"errMsg":"document.update:ok"}

虽然显示云函数调用成功,但检查数据库发现后面触发器自动执行后,数据库里的数据没有得到更新



- 预期表现

使用触发器云函数update数据库数据,数据每次应该得到更新。


- 复现路径

云函数 getYi 的主要代码:

// config.json


其中触发器每10s执行一次。


// index.js

 

云数据库yiDB:有一个_ID是 yiDB-data 的数据,但是上传部署云函数 getYi 后,只有第一次执行时能更新 yiDB-data 数据,后面触发器每隔10s自动执行的都更新不了数据。




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

4 个回答

  • MasonLu
    MasonLu
    2019-01-30

    云函数实际在执行用户请求的时候,是起了一个容器,当短时间内频繁有用户请求的时候,容器会进行复用已加快响应速度。

    因此,如果想要代码每次都会被执行,需要把代码逻辑写到main函数内部。复用容器的时候,初始化代码(main函数外)只会被首次执行

    2019-01-30
    有用 3
    回复 2
    • 星际骑兵
      星际骑兵
      2019-01-30

      是的!

      2019-01-30
      回复
    • 🌏Chen
      🌏Chen
      2020-04-26
      我遇到一个类似问题,触发器设定每2小时获取一次其它几个小程序的access_token,写了一个递归调用的方法。手动执行的时候,整个正常能执行,上传触发器后,始终不执行(云函数是按触发器设定的时间触发了,但是里面的方法并没有被执行)。而后看了您的回答,我把递归调用的方法写到main内部去,遗憾是手动触发云函数正常,触发器触发,代码不执行。疑惑中。。。。
      2020-04-26
      回复
  • 星际骑兵
    星际骑兵
    2019-01-26

    该问题已解决,要执行的内容必须都放在 exports.main 里面。

    2019-01-26
    有用 1
    回复 4
    • 苏儿
      苏儿
      2019-01-29

      兄弟详细点啊

      2019-01-29
      回复
    • 星际骑兵
      星际骑兵
      2019-01-29回复苏儿

      这么写


      exports.main = async (event, context) => {
        try {
          // 放在这里
          var yiArr = ['t1', 't2', 't3']
          var index = Math.floor((Math.random() * yiArr.length));
          var yige = yiArr[index]
          return await db.collection('yiDB').doc('yiID').update({
            // data 传入需要局部更新的数据
            data: {
              // 表示将 result 字段置为 yige
              result: yige
            }
          })
        } catch (e) {
          console.error(e)
        }
      }


      2019-01-29
      1
      回复
    • 苏儿
      苏儿
      2019-01-29

      // 云函数入口文件

      const cloud = require('wx-server-sdk')

      cloud.init()

      const db = cloud.database()

      const _ = db.command

      // 云函数入口函数

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

      try {

      return await db.collection('news').doc(event._id).update({

      // data 传入需要局部更新的数据

      data: {

      pageviews:event.pageviews

      }

      })

      } catch (e) {

      console.error(e)

      }

      }


      index.js


      wx.cloud.callFunction({

       // 云函数名称

       name: 'addPageView',

       // 传给云函数的参数

       data: {

         _id:this.data_id,

         pageviews:pageviews

       },

       success: function (res) {

         console.log(res)

       },

       fail: console.error

      })

      为什么我这样写,点击按钮只修改成功第一次,第二次就开始是 update 为0 了

      2019-01-29
      回复
    • 星际骑兵
      星际骑兵
      2019-01-29回复苏儿

      你这个应该是新增一条,不是更新一条吧,应该用collection('news').doc(event._id).set 吧,你看一下文档

      2019-01-29
      回复
  • Simon
    Simon
    2020-03-24

    如果是插入多条呢,而且中间有的可能失败,需要一个for循环吧,直接return好像不行?

    2020-03-24
    有用
    回复
  • 苏儿
    苏儿
    2019-01-29

    怎么解决的啊,可不可以详细点


    2019-01-29
    有用
    回复
登录 后发表内容