收藏
回答

小程序在使用triggers调用云函数,发送模版消息不能设置具体时间调用,必须设置多次调用才生效?

今天遇到一个很神奇的问题,使用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 * * * * *"
    }
  ]


多次调用,但很多次是失败的

回答关注问题邀请回答
收藏

3 个回答

  • ⅴ
    07-03

    不是没有发出去,是发出去了,还没收到回调。就执行下一行代码了。

    看下JS同步/异步相关的内容吧。

    07-03
    有用
    回复
  • showms
    showms
    07-03

    云调用加个await

    07-03
    有用
    回复
  • 跨商通
    跨商通
    07-03

    云函数中不用await的,一律算错。

    await cloud.openapi.subscribeMessage.send()
    

    批量的话,可以用Promise.all

    07-03
    有用
    回复
登录 后发表内容