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
更多关于uni-app unipush2.0我们后端调用url云函数时有小概率云函数返回500的实战教程也可以访问 https://www.itying.com/category-93-b0.html
针对uni-app unipush2.0云函数偶发500错误的问题,分析如下:
-
服务端限流或临时故障:UniPush服务端可能存在瞬时高并发限制或内部服务波动,导致部分请求被拒绝。建议在云函数中添加重试机制,对失败请求进行1-2次延迟重试。
-
厂商通道限制:代码中使用了多个厂商通道(HW/HO/VV/XM/OP),部分厂商对测试消息有限频(如华为每日500条测试消息)。检查
targetUserType参数是否误用了测试模式,确保生产环境不使用测试标识。 -
参数边界问题:角标数值处理(
badge>99?99:badge)可能引发类型异常。建议添加参数校验:
if (typeof body.payload.badge !== 'number') {
return { code: 400, message: 'Invalid badge format' }
}
-
云函数超时:推送处理耗时可能超过默认超时时间(通常3秒)。可在uniCloud控制台调整云函数超时设置至5-10秒,并监控执行时长。
-
异步错误捕获:在
sendMessage外层添加错误捕获:
try {
return await uniPush.sendMessage(sendOptions)
} catch (e) {
console.error('Push failed:', e)
return { code: 500, message: 'Send failed' }
}

