node.js - 如何避免 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;
}
}
此外,如果不向我的用户发送产品消息,我也找不到测试代码的方法……这使测试变得困难。
解决方案
推荐阅读
- javascript - KeyboardDatePicker 将日期和月份更改为全长
- javascript - “范围的坐标超出了工作表的尺寸。” 排序时出错
- c# - C# 将日期舍入到一个月的 10 号、20 号或 30 号
- c# - 从代码检查并创建丢失的游戏对象(不是在游戏过程中)
- node.js - next.js 错误:错误:> 由于 webpack 错误,构建失败
- python - 如何使用 pyrebase 从 firebase 检索用户数据?
- python - 如何使用 python-docx 从现有 docx 文件中提取一系列段落
- oracle - PL/SQL UTL_FILE 包从 csv 读取并将值加载到表中
- python - 如何访问每行上选定单选按钮的值
- python - 如何从 Python 脚本调用 C 函数?