uni-app unipush2.0我们后端调用url云函数时有小概率云函数返回500

uni-app unipush2.0我们后端调用url云函数时有小概率云函数返回500

产品分类:
uniCloud/支付宝小程序云

示例代码:

'use strict';    
const uniPush = uniCloud.getPushManager({appId:"__UNI__DABF927"}) //注意这里需要传入你的应用appId    
exports.main = async (event, context) => {  
    const body = JSON.parse(event.body);  
    const sendOptions = {    
        "push_clientid": body.push_clientid,     //填写上一步在uni-app客户端获取到的客户端推送标识push_clientid    
        // "force_notification":true,  //填写true,客户端就会对在线消息自动创建“通知栏消息”。    
        "title":body.title,  
        "content": body.content,  
        "badge": body.payload.badge,  
        "settings": {    
            //消息有效期设置,单位毫秒,-1表示不设离线。默认是 2 小时,取值范围:-1 ~ 3 * 24 * 3600 * 1000(3天)之间    
            "ttl":86400000    
        },    
        "payload": body.payload,  
        // "category": {    
        //     //HarmonyOS NEXT系统(纯血鸿蒙、非安卓鸿蒙)的消息分类,要给鸿蒙设备推送时才必传    
        //     "harmony":"MARKETING", "huawei":"EXPRESS", "vivo":"ORDER"  
        // },    
        "options":{    
            "HW": {        
                  // 值为int 类型。1 表示华为测试消息,华为每个应用每日可发送该测试消息500条。此 target_user_type 参数请勿发布至线上。        
                  // "/message/android/target_user_type":body.payload.targetUserType,  
                  "/message/android/category": body.payload.hwCategory,  
                  // "/message/android/notification/badge/add_num": 1,  
                  // "/message/android/notification/badge/add_num": body.payload.badge,  
                  "/message/android/notification/badge/set_num": body.payload.badge>99?99:body.payload.badge,  
                  "/message/android/notification/badge/class": "io.dcloud.PandoraEntry",    
                  //add_num 为离线推送时,设置的华为角标,1表示在当前的角标数上+1    
              } ,      
            "HO": {        
                 //值为int 类型。1 表示测试推送,不填默认为0。荣耀每个应用每日可发送该测试消息1000条。此测试参数请勿发布至线上。    
                  // "/android/targetUserType": body.payload.targetUserType,  
                  "/android/notification/importance": body.payload.hoImportance,  
                  "/android/notification/badge/setNum":body.payload.badge>99?99:body.payload.badge,  
                  // "/android/notification/badge/addNum": 1,    
                  //add_num 为离线推送时,设置的荣耀角标,1表示在当前的角标数上+1    
                  "/android/notification/badge/badgeClass": "io.dcloud.PandoraEntry"    
              } ,    
            "VV": {        
                 //值为int 类型。0 表示正式推送;1 表示测试推送,不填默认为0。此 pushMode 参数请勿发布至线上。    
                  // "/pushMode": body.payload.targetUserType,  
                  "/category": body.payload.vvCategory,  
              } ,      
            "XM": {        
                 //新小米消息分类下,私信公信id都必须要传,否则请求小米厂商接口会被拦截    
                  "/extra.channel_id": body.payload.xmChannelId  
              },  
            "OP": {  
                  "/channel_id": body.payload.opChannelId,  
                  "/category": body.payload.opCategory,  
                  "/notify_level": body.payload.opNotifyLevel, //通知栏消息提醒等级取值定义。1:通知栏,2:通知栏+锁屏,16:通知栏+锁屏+横幅+震动+铃声。使用notify_level参数时,category参数必传。  
                  "/private_msg_template_id": body.payload.opMsgTemplateId,  
                  "/private_title_parameters": body.payload.opTitleParameters,  
                  "/private_content_parameters": body.payload.opContentParameters,  
              }  
        }    
    }  
    if(body.payload.targetUserType) {  
        sendOptions.options.HW["/message/android/target_user_type"] = body.payload.targetUserType  
        sendOptions.options.HO["/android/targetUserType"] = body.payload.targetUserType  
        sendOptions.options.VV["/pushMode"] = body.payload.targetUserType  
    }  
    return await uniPush.sendMessage(sendOptions)    
};

操作步骤:

使用后端调用云函数,有小概率云函数返回500报错

预期结果:

返回正确结果

实际结果:

大概每天发一千多条,偶尔会有几条数据返回500报错

bug描述:

unipush2.0,我们后端调用url云函数时,有小概率云函数返回500,绝大部分是正常的,返回500的数据也没计入云函数的日志中,云函数日志记录的只有400的数据。


更多关于uni-app unipush2.0我们后端调用url云函数时有小概率云函数返回500的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app unipush2.0我们后端调用url云函数时有小概率云函数返回500的实战教程也可以访问 https://www.itying.com/category-93-b0.html


针对uni-app unipush2.0云函数偶发500错误的问题,分析如下:

  1. 服务端限流或临时故障:UniPush服务端可能存在瞬时高并发限制或内部服务波动,导致部分请求被拒绝。建议在云函数中添加重试机制,对失败请求进行1-2次延迟重试。

  2. 厂商通道限制:代码中使用了多个厂商通道(HW/HO/VV/XM/OP),部分厂商对测试消息有限频(如华为每日500条测试消息)。检查targetUserType参数是否误用了测试模式,确保生产环境不使用测试标识。

  3. 参数边界问题:角标数值处理(badge>99?99:badge)可能引发类型异常。建议添加参数校验:

if (typeof body.payload.badge !== 'number') {
  return { code: 400, message: 'Invalid badge format' }
}
  1. 云函数超时:推送处理耗时可能超过默认超时时间(通常3秒)。可在uniCloud控制台调整云函数超时设置至5-10秒,并监控执行时长。

  2. 异步错误捕获:在sendMessage外层添加错误捕获:

try {
  return await uniPush.sendMessage(sendOptions)
} catch (e) {
  console.error('Push failed:', e)
  return { code: 500, message: 'Send failed' }
}
回到顶部