小程序云函数+触发器更新数据库失败(仅上传云函数后第一次调用时成功) [你这句话把握搞懵了。]

- 当前 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自动执行的都更新不了数据。




  • 云函数实际在执行用户请求的时候,是起了一个容器,当短时间内频繁有用户请求的时候,容器会进行复用已加快响应速度。 因此,如果想要代码每次都会被执行,需要把代码逻辑写到main函数内部。复用容器的时候,初始化代码(main函数外)只会被首次执行 , 都说“女子无才便是德”,我想我应该是德高望重了。
    • 是的!, 我反对,我认为不是
  • 怎么解决的啊,可不可以详细点 , 你要多详细?
  • 该问题已解决,要执行的内容必须都放在 exports.main 里面。, 里面好玩吗
    • 兄弟详细点啊, 你觉得把兄弟看做一种身份怎么样?
    • 这么写 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)   } } , 说的貌似很有深意,你能一条一条说么?
    • // 云函数入口文件 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 了 , 说的貌似很有深意,你能一条一条说么?