You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过单次请求使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:37:30