uni-app uniPush.sendMessage()并行发送到不同用户时发送异常

发布于 1周前 作者 htzhanglong 来自 Uni-App

uni-app uniPush.sendMessage()并行发送到不同用户时发送异常

开发环境 版本号 项目创建方式
Windows 22h2 HBuilderX

产品分类:uniapp/H5

浏览器平台:Chrome
浏览器版本:119.0.6045.200

示例代码:

for(xxxxxx){  
    let pushSend = {  
        "user_id": xxxxx,  
        "title": title,   
        "content": content,  
        "payload": {  
            "oids":xxx  
        }  
    }  
    uniPush.sendMessage(pushSend)  
    .then(res=>{  
        console.log("push res:", res);  
        if(res.errCode){  
            console.log("推送失败:", res.errMsg);  
        }  
    })  
    .catch(err=>{  
        console.log("push err:", err);  
    })  
}

操作步骤:

for(xxxxxx){  
    let pushSend = {  
        "user_id": xxxxx,  
        "title": title,   
        "content": content,  
        "payload": {  
            "oids":xxx  
        }  
    }  
    uniPush.sendMessage(pushSend)  
    .then(res=>{  
        console.log("push res:", res);  
        if(res.errCode){  
            console.log("推送失败:", res.errMsg);  
        }  
    })  
    .catch(err=>{  
        console.log("push err:", err);  
    })  
}

预期结果:

不同用户都正确收到推送消息

实际结果:

一个用户没有收到消息,一个用户重复收到两条一样内容的消息。


3 回复

在服务端异步调用?这样可能还会出现:请求还没完成,云函数实例就已经结束的情况。 这种业务场景可以使用 promise all实现,另外注意每个任务需要调用一次 uniCloud.getPushManager使得每个任务拿到的是不同的实例


“每个任务需要调用一次 uniCloud.getPushManager使得每个任务拿到的是不同的实例”,这个麻烦在文档里面说明一下?

在使用 uni-appuniPush.sendMessage() 方法时,如果并行发送消息到不同用户时出现异常,可能是由于以下几个原因导致的。你可以根据这些原因进行排查和解决:

1. 并发限制

  • 问题描述uniPush.sendMessage() 可能在处理并发请求时存在限制,导致并发量过大时出现异常。
  • 解决方案:尝试对发送请求进行限流,例如通过队列或分批发送的方式,减少并发量。可以使用 Promise.all() 来控制并发请求的数量。
const users = ['user1', 'user2', 'user3'];
const sendMessagePromises = users.map(user => uniPush.sendMessage(user, 'your message'));

// 控制并发数量
const concurrency = 5; // 每次最多发送5条消息
const chunkedPromises = [];
for (let i = 0; i < sendMessagePromises.length; i += concurrency) {
    chunkedPromises.push(Promise.all(sendMessagePromises.slice(i, i + concurrency)));
}

Promise.all(chunkedPromises)
    .then(() => console.log('All messages sent successfully'))
    .catch(err => console.error('Error sending messages:', err));

2. API 限制

  • 问题描述uniPush 的 API 可能存在调用频率限制,导致在短时间内发送大量请求时被拒绝或失败。
  • 解决方案:查阅 uniPush 的官方文档,了解 API 的调用频率限制,并根据限制调整发送策略。可能需要增加延迟或使用队列来管理发送任务。

3. 网络问题

  • 问题描述:并发请求可能会对网络造成压力,导致部分请求超时或失败。
  • 解决方案:确保网络稳定,并考虑增加重试机制来处理失败请求。
const sendMessageWithRetry = async (user, message, retries = 3) => {
    for (let i = 0; i < retries; i++) {
        try {
            await uniPush.sendMessage(user, message);
            return;
        } catch (err) {
            if (i === retries - 1) throw err;
            await new Promise(resolve => setTimeout(resolve, 1000)); // 延迟1秒后重试
        }
    }
};

const users = ['user1', 'user2', 'user3'];
Promise.all(users.map(user => sendMessageWithRetry(user, 'your message')))
    .then(() => console.log('All messages sent successfully'))
    .catch(err => console.error('Error sending messages:', err));

4. 用户 Token 失效

  • 问题描述:如果用户的推送 Token 失效或未正确获取,会导致消息发送失败。
  • 解决方案:确保在发送消息前,每个用户的推送 Token 是有效的。可以在发送前进行 Token 校验,并在 Token 失效时重新获取。

5. 日志与调试

  • 问题描述:如果没有详细的日志信息,可能难以定位具体问题。
  • 解决方案:在发送消息时,增加详细的日志记录,捕获并记录每个请求的响应状态和错误信息,以便更好地排查问题。
const sendMessageWithLog = async (user, message) => {
    try {
        const result = await uniPush.sendMessage(user, message);
        console.log(`Message sent to ${user}:`, result);
        return result;
    } catch (err) {
        console.error(`Failed to send message to ${user}:`, err);
        throw err;
    }
};

const users = ['user1', 'user2', 'user3'];
Promise.all(users.map(user => sendMessageWithLog(user, 'your message')))
    .then(() => console.log('All messages sent successfully'))
    .catch(err => console.error('Error sending messages:', err));
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!