首页 > 解决方案 > 如何避免 DEADLINE_EXCEEDED 解析 firestore 数据库发送推送通知?

问题描述

我正在尝试向存储在 Firestore 中的 10 000 多个令牌发送推送通知。每次,我都会收到一个 DEADLINE_EXCEEDED 错误。我已经将超时更新为 300 秒。

我不知道如何改进我的代码以避免此错误。

const pagination = 200;

function parseAndSend(push) {

    const parse = async(request, total) => {

            let snapshot = await request.get();
            
            let lastVisible = snapshot.docs[snapshot.docs.length-1];
            let length = snapshot.size;
    
            var users= {};

            snapshot.forEach((doc) => {
               pushHelperFunctions.addUsers(doc, users);
            });

            pushHelperFunctions.sendMessage(users, push);

            if(length < pagination) {

                return console.log("finish", total+length);

            } else {

                let next = admin.firestore().collection("users").startAfter(lastVisible).limit(pagination);

                return parse(next, total+length);

            }

    }

    return parse(admin.firestore().collection("users").limit(pagination), 0);
}


async function sendMessage(users, push) {

  Object.keys(users).forEach(key => {

      if (users[key].length > 0) {
        
            let message = payloads.setMessage(users[key], key, push);

            // Send notifications to all tokens.
            admin.messaging().sendMulticast(message).then(response => {
                console.log(response.successCount + " messages were sent successfully");

                cleanupTokens(response, users[key]);
                
                return true;

            }).catch(error => {
                mailer.sendMail("messaging().sendToDevice - Error sending message "+push);
                console.log("Error sending message:", error);
                return false;
            });

      }

        
  });

}


// Cleans up the tokens that are no longer valid.
function cleanupTokens(response, tokens) {
    // For each notification we check if there was an error.

     if (response.failureCount > 0) {

        const tokensDelete = [];
        const failedTokens = [];
        response.responses.forEach((resp, index) => {

          if (!resp.success) {
            failedTokens.push(tokens[index]);

            const deleteTask = admin.firestore().collection('users').doc(tokens[index]).delete();
            tokensDelete.push(deleteTask);
          }
       
        });

        console.log('List of tokens that caused failures: ' + failedTokens);

        return Promise.all(tokensDelete);
    } else {
        return null;
    }
}

此外,如果不向我的用户发送产品消息,我也找不到测试代码的方法……这使测试变得困难。

标签: node.jsgoogle-cloud-firestorefirebase-cloud-messaging

解决方案


推荐阅读