上一篇介绍我开发小程序的同时,已经简单的介绍了微信云开发的CURD了,接下来由于微信小程序的新功能,需要用到定时器触发器,于是就遇到了一个坑。
完整代码我会放在最下方,有需要直接拉到最后,要注意配置定时任务的时间
云开发定时触发器
首先触发器也是一个云函数,只不过是需要在开发云函数的时候,需要额外做一些配置定时配置,以及额外操作。
- 首先创建一个云函数
如果代码中有相关的依赖包,在上传云函数的时要安装依赖。如我的云函数中需要moment,就要为云函数安装依赖。
此时你得到的是一个普通的云函数,接下来在config.js文件中加入定时触发器的配置
随后同步云函数,再上传云触发器
你以为到这里就万事大吉了??? 不,还有一个坑,就是时间配置 当你在本地测试都是正常的时候,一到线上,发现不对劲,其实的触发器的时间环境配置不对,默认会晚8个小时。
需要加一个云函数环境变量
配置信息 :key:TZ value:Asia/shanghai
到此结束~ 可以开始线上测试了,
云函数执行后的日志都在这里
已上线小程序~
微信小程序:【打工猫的在逃计划】
完整代码
const moment = require('moment')
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database()
const kTableName = 'planList'
const errorLogName = 'errorLog'
const MAX_LIMIT = 100
// 云函数入口函数
exports.main = async (event, context) => {
try {
// 先取出集合记录总数
const countResult = await db.collection(kTableName).count()
const total = countResult.total
// 计算需分几次取
const batchTimes = Math.ceil(total / MAX_LIMIT)
// 承载所有读操作的 promise 的数组
const tasks = []
const _ = db.command
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection(kTableName).skip(i * MAX_LIMIT).limit(MAX_LIMIT).where({
planEndDate: _.lte(moment().format('yyyy-MM-DD')),
status: '1'
}).get()
tasks.push(promise)
}
const promiseAll = await Promise.all(tasks)
for (let pageInx = 0; pageInx < promiseAll.length; pageInx++) {
const pageItem = promiseAll[pageInx].data;
for (let listInx = 0; listInx < pageItem.length; listInx++) {
let item = pageItem[listInx];
try {
await db.collection(kTableName).doc(item._id).update({
data: {
status: '2',
updateTime: moment().format('yyyy-MM-DD')
}
})
} catch (e) {
await db.collection(errorLogName).add({
data: {
error: e,
data: JSON.stringify(item),
createTime: moment().format('yyyy-MM-DD')
},
})
}
}
}
return {
data: 'success',
code: 200
}
} catch (error) {
return {
data: 'error',
code: 500
}
}
}