能否通过单次请求使用FCM同时向两个服务器密钥发送消息?
能否通过FCM单次请求向两个服务器密钥发送消息?
很遗憾,不行。FCM(Firebase Cloud Messaging)的API设计规则是:每个请求只能使用一个服务器密钥进行身份验证。因为请求的Authorization头部只能携带一个有效的密钥,FCM服务器也不会处理包含多个密钥的请求——它只会识别第一个密钥,或者直接返回验证错误。
为什么不能这么做?
FCM的服务器密钥是绑定到具体Firebase项目的,每个密钥对应一个独立的项目资源。单次请求只能归属一个项目,所以无法同时用两个密钥来发送消息。
替代方案:遍历密钥逐个发送
既然单次请求不行,我们可以通过循环遍历所有服务器密钥,逐个发送FCM请求。结合你提供的代码,我帮你调整成支持多密钥批量发送的版本:
首先,修改你的sendToKey函数,让它返回请求的Promise(因为request-promise本身就是基于Promise的):
const rp = require("request-promise"); const rawKeys = "key-one, key-two"; function sendToKey(serverKey) { const requestOptions = { method: "POST", uri: "https://fcm.googleapis.com/fcm/send", headers: { Authorization: "key=" + serverKey }, json: true, body: { to: "Device Token Here", priority: "high", content_available: true, notification: { title: "Test Title..." } } }; // 返回Promise,方便后续处理异步流程 return rp(requestOptions); }
然后,添加一个批量发送的函数,你可以选择并行发送(效率更高)或者串行发送(避免请求频率过高):
并行发送(推荐,适合密钥数量不多的情况)
async function sendToMultipleKeys() { // 拆分密钥为数组 const serverKeys = rawKeys.split(', '); try { // 同时发送所有请求,等待全部完成 const results = await Promise.all(serverKeys.map(key => sendToKey(key))); console.log('所有通知发送成功:', results); } catch (error) { console.error('发送过程中出现错误:', error); } } // 调用批量发送函数 sendToMultipleKeys();
串行发送(适合密钥较多,怕触发频率限制的情况)
async function sendToMultipleKeysSerial() { const serverKeys = rawKeys.split(', '); for (const key of serverKeys) { try { const result = await sendToKey(key); console.log(`使用密钥 ${key} 发送成功:`, result); } catch (error) { console.error(`使用密钥 ${key} 发送失败:`, error); // 这里可以选择继续发送下一个,或者break终止流程 } } } // 调用串行发送函数 sendToMultipleKeysSerial();
这样就能实现给多个服务器密钥对应的项目发送消息的需求了。
内容的提问来源于stack exchange,提问作者Joe Scotto
相关产品推荐
相关产品推荐

