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

使用Firebase Functions创建消息Campaign报错:createCampaign方法不存在

问题原因

Firebase Admin SDK的messaging()模块没有提供createCampaign()方法,消息推广Campaign属于Firebase控制台的营销自动化功能,Admin SDK并不直接支持创建这类营销活动,这就是你报错的核心原因。

可行替代方案

方案1:用Admin SDK实现批量定时消息发送

如果你的需求是定时给指定用户群体发送消息,可以通过以下步骤自行实现类似Campaign的效果:

  1. 提前将目标用户的FCM令牌存储在Firestore或Realtime Database中
  2. 通过Cloud Functions的事件触发器(如Firestore更新)或定时触发器触发消息发送
  3. 调用Admin SDK的批量消息接口完成发送,并自行处理调度逻辑

示例代码:

const admin = require('firebase-admin');
const functions = require('firebase-functions');

admin.initializeApp({
    credential: admin.credential.cert("serviceAccountKey.json"),
});

// 触发时机:Firestore文档更新时发送批量消息
exports.sendScheduledCampaign = functions.firestore
    .document("/documents/{documentId}")
    .onUpdate(async (change, context) => {
    // 1. 从数据库拉取目标用户的FCM令牌列表
    const tokensSnapshot = await admin.firestore().collection('user-fcm-tokens').get();
    const tokens = tokensSnapshot.docs.map(doc => doc.data().token);

    // 2. 构造消息内容
    const message = {
        notification: {
            title: 'New products!',
            body: 'Check out our latest products!'
        },
        tokens: tokens // 指定批量发送的令牌列表
    };

    // 3. 执行批量消息发送
    try {
        const response = await admin.messaging().sendMulticast(message);
        console.log('消息发送成功数:', response.successCount);
        console.log('消息发送失败数:', response.failureCount);

        // 可选:清理无效令牌
        const invalidTokens = [];
        response.responses.forEach((resp, idx) => {
            if (!resp.success) invalidTokens.push(tokens[idx]);
        });
        if (invalidTokens.length > 0) {
            const batch = admin.firestore().batch();
            for (const token of invalidTokens) {
                const docQuery = admin.firestore().collection('user-fcm-tokens').where('token', '==', token).limit(1);
                const snap = await docQuery.get();
                snap.forEach(doc => batch.delete(doc.ref));
            }
            await batch.commit();
        }
    } catch (error) {
        console.error('批量消息发送失败:', error);
    }
});

// 示例:每日9点定时发送消息
exports.dailyCampaign = functions.pubsub.schedule('0 9 * * *')
    .timeZone('Asia/Shanghai')
    .onRun(async (context) => {
    const tokensSnapshot = await admin.firestore().collection('user-fcm-tokens').get();
    const tokens = tokensSnapshot.docs.map(doc => doc.data().token);

    const message = {
        notification: {
            title: '每日新品推荐',
            body: '今日新品已上线,快来看看!'
        },
        tokens: tokens
    };

    try {
        const response = await admin.messaging().sendMulticast(message);
        console.log('定时消息发送完成:', response);
    } catch (error) {
        console.error('定时消息发送失败:', error);
    }
    return null;
});

方案2:调用Firebase Management API创建官方Campaign

如果需要完全复用Firebase控制台的Campaign功能(包含受众分组、发送统计等),可以在Cloud Functions中调用Firebase Management API的Campaign创建接口。需要注意:

  • 服务账号需配置firebase.messaging相关权限
  • 需构造符合API规范的请求体,并完成OAuth2认证

示例代码(使用google-auth-library处理认证):

const admin = require('firebase-admin');
const functions = require('firebase-functions');
const fetch = require('node-fetch');
const { GoogleAuth } = require('google-auth-library');

admin.initializeApp();

exports.createCampaignViaAPI = functions.firestore
    .document("/documents/{documentId}")
    .onUpdate(async (change, context) => {
    // 获取API访问令牌
    const authClient = new GoogleAuth({
        keyFile: 'serviceAccountKey.json',
        scopes: ['https://www.googleapis.com/auth/firebase.messaging']
    });
    const accessToken = await authClient.getAccessToken();

    // 构造Campaign参数
    const campaignData = {
        name: 'my-campaign',
        message: {
            notification: {
                title: 'New products!',
                body: 'Check out our latest products!'
            }
        },
        schedule: {
            startTime: '2023-05-05T09:00:00Z',
            endTime: '2023-05-10T18:00:00Z'
        },
        audience: {
            condition: "'active' in topics" // 指定受众条件
        }
    };

    // 调用API创建Campaign
    const projectId = admin.app().options.projectId;
    const apiUrl = `https://firebase.googleapis.com/v1/projects/${projectId}/messaging/campaigns`;

    try {
        const response = await fetch(apiUrl, {
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${accessToken}`,
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(campaignData)
        });

        if (!response.ok) throw new Error(`API请求失败:${response.statusText}`);
        const result = await response.json();
        console.log('Campaign创建成功:', result);
    } catch (error) {
        console.error('创建Campaign失败:', error);
    }
});
注意事项
  • 方案1更轻量化,适合简单的批量定时消息场景,无需依赖外部API
  • 方案2能完全复用Firebase官方Campaign的功能,但需要处理API认证和权限配置,复杂度更高

内容的提问来源于stack exchange,提问作者yonatan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:03:15