【发布时间】:2018-07-28 13:49:32
【问题描述】:
我有这样的事情:
const promises = [];
l = niz.length;
for (i = 0; i < l; i++) {
if(niz[i].length === 0) {
continue;
}
promises.push(admin.messaging().sendToDevice(niz[i], payload, options));
}
return Promise.all(promises).then((response) => {
return cleanupTokens(response, tokens);
//return resolve();
}).then(() => {
return resolve();
});
但我总是在 firebase 日志中崩溃:
TypeError:无法读取未定义的属性“forEach” 在 cleanupTokens (/user_code/index.js:193:20) 在 Promise.all.then (/user_code/index.js:169:20) 在 process._tickDomainCallback (internal/process/next_tick.js:135:7)
回复是:
响应:[{结果:[[对象]], canonicalRegistrationTokenCount: 0, 失败计数:0, 成功计数:1, 多播ID:5591935326806715000 } ]
响应:未定义
清理是:
function cleanupTokens(response, tokens) {
// For each notification we check if there was an error.
const tokensToRemove = {};
console.log('response: ', response);
console.log('response: ', JSON.stringify(response.results));
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
console.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens who are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered' ||
error.code === 'messaging/invalid-recipient') {
tokensToRemove[`/tokens/${tokens[index]}/g`] = null;
tokensToRemove[`/tokens/${tokens[index]}/l/0`] = null;
tokensToRemove[`/tokens/${tokens[index]}/l/1`] = null;
}
}
});
return admin.database().ref().update(tokensToRemove);
}
对清理令牌有帮助吗?
【问题讨论】:
-
看起来
response.results不是一个数组。您能否将console.log('response: ', response.results);替换为console.log('response: ', JSON.stringify(response.results));并将该日志添加到您的问题中。 -
当然,它是未定义的
-
有趣,因为您的原始日志显示
results: [ [Object]这似乎表明results是一个数组。但如果是undefined,您应该在调用forEach之前检查它。所以if (response.results) { response.results.forEach(...
标签: node.js firebase google-cloud-functions