今天遇到一个很神奇的问题,使用triggers触发云函数时,如果设置具体的时间,比如设置每天20点调用,这个时候云函数是会被调用,但是消息一定不会被发送出去,最后试验发现,只要设置多次调用,那就可以。
但是感觉不应该这样做,首先这种做法偶然性太强,其次太过于耗费资源,大家在写触发消息时是怎么写的呢?
// 云函数入口文件
const cloud = require('wx-server-sdk')
let skipData = 0 // 分页跳过的数据
let numberPatients = [] // 患者数量
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
const db = cloud.database()
// 查询当日患者
async function getTodayPatient() {
let date = new Date();
let year = date.getFullYear();
let month = (date.getMonth() + 1).toString().padStart(2, '0');
let day = date.getDate().toString().padStart(2, '0');
let newDate = year + '-' + month + '-' + day;
// console.log('3333',newDate)
try {
let res = await db.collection('patient_record')
.where({
opeTime: newDate
})
.skip(skipData)
.limit(20)
.get();
// console.log('4444',res)
return res.data;
} catch (error) {
console.error('查询失败', error);
return null;
}
}
// 递归查询患者
async function getPatient() {
let temp = []
let res = await getTodayPatient();
// console.log('2222',res)
if(res && res.length > 0){
skipData = skipData + 20
temp = res
}
numberPatients.push(...temp)
if(temp.length === 20){ // 数据存在20,表示有可能还有数据,继续递归
getPatient()
}else{
return numberPatients
}
}
/**
* 循环数据发送信息给患者
* @param {object} patientsData 患者的数据
*/
function sendMessage(patientsData) {
const templateId = 'Gnr32LdpxdA58DX-zDGi3OSKUEmLivBJ9MBig6BSp-Q' // 模版编号
const { _openid, username, opeTime, phone } = patientsData
try {
cloud.openapi.subscribeMessage.send({
touser: _openid, // 通过 getWXContext 获取 OPENID
page: '/pages/myLogin/index', // 点击跳转的页面
lang: 'zh_CN',
data: { // 信息的内容
name1: {
value: username
},
date3: {
value: opeTime
},
phone_number4: {
value: phone
},
thing7: {
value: '今天是您预约手术时间,请安时到达医院。'
}
},
templateId,
miniprogramState: 'developer'
});
console.log(_openid + ' ' + '订阅消息发送成功');
} catch (err) {
console.error(_openid + ' ' + '订阅消息发送失败:', err);
}
}
exports.main = async (event, context) => {
// 获取患者数据,循环发送消息
let temp = await getPatient()
// let logArr = []
// let logArrItem
if(temp && temp.length > 0){
temp.forEach(item=>{
// logArrItem = sendMessage(item)
sendMessage(item)
// logArr.push(logArrItem)
})
}else{
console.warn('没有预约患者需要发送通知')
}
// return logArr
}
我是获取一个数组然后循环发送,需求是可以实现,但是总觉得这种写是错误的。
"triggers": [
{
"name": "tomylove",
"type": "timer",
"config": "*/10 29 * * * * *"
}
]
多次调用,但很多次是失败的
不是没有发出去,是发出去了,还没收到回调。就执行下一行代码了。
看下JS同步/异步相关的内容吧。
云调用加个await
云函数中不用await的,一律算错。
批量的话,可以用Promise.all