- 当前 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 了
你这个应该是新增一条,不是更新一条吧,应该用collection('news').doc(event._id).set 吧,你看一下文档
如果是插入多条呢,而且中间有的可能失败,需要一个for循环吧,直接return好像不行?
怎么解决的啊,可不可以详细点