如何通过HTTPS Cloud Function发送推送通知及代码故障排查
基于HTTPS Cloud Function发送FCM推送通知的故障排查与实现方案
常见故障排查点
- 未正确处理异步请求与响应返回:现有代码在
admin.messaging().send()异步操作完成前没有给客户端返回响应,云函数会提前被强制回收,导致推送逻辑未执行完成;同时未捕获异步操作的错误,无法定位具体报错原因。 - 未做入参校验:如果请求参数
token/title/body为空或者格式非法,会直接导致FCM请求失败,没有前置校验逻辑抛出明确错误。 - 未处理跨域/请求方法限制:如果是前端直接调用该HTTPS接口,默认云函数没有处理OPTIONS预检请求,会出现跨域报错导致请求失败。
- 权限配置问题:部署云函数的服务账号没有FCM发送权限,或者Firebase项目未正确开启Cloud Messaging服务。
- 客户端令牌有效性问题:传入的
token是过期、无效或者对应客户端未正确配置FCM接收权限,也会导致推送发送失败。
修正后的实现代码
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); exports.sendNotificationToUser = functions.https.onRequest(async (request, response) => { // 处理跨域预检请求,可根据业务需求限制允许的域名 response.set('Access-Control-Allow-Origin', '*'); if (request.method === 'OPTIONS') { response.set('Access-Control-Allow-Methods', 'GET, POST'); response.set('Access-Control-Allow-Headers', 'Content-Type'); return response.status(204).send(''); } try { // 兼容GET查询参数和POST请求体传参 const params = request.method === 'GET' ? request.query : request.body; const { token, title, body } = params; // 入参合法性校验 if (!token || !title || !body) { return response.status(400).send({ success: false, message: '缺少必填参数:token、title、body' }); } const payload = { token: token, notification: { title: title, body: body }, data: { body: body } }; const fcmResponse = await admin.messaging().send(payload); console.log('推送发送成功:', fcmResponse); return response.status(200).send({ success: true, message: '推送发送成功', data: fcmResponse }); } catch (error) { // 打印错误日志便于排查 console.error('推送发送失败:', error); return response.status(500).send({ success: false, message: '推送发送失败', error: error.message }); } });
后续定位方法
- 调用接口后查看Google Cloud Console或者Firebase控制台的云函数日志,代码中已经打印了完整错误信息,可直接根据错误提示定位具体问题,比如无效token会返回
InvalidRegistration错误、权限不足会返回PermissionDenied错误。 - 可以先在本地用Firebase emulators模拟运行云函数,本地调试确认逻辑无误后再部署到线上。
- 单独校验传入的客户端token有效性,可以通过Firebase控制台的FCM测试工具直接输入token发送测试通知,排除客户端配置问题。
内容的提问来源于stack exchange,提问作者Daniel Corona
相关产品推荐
相关产品推荐

