我对Flutter和工作方式有点陌生。我正在研究一个应用程序在Flutter发送推送通知时,用户想要发送它给用户。
该函数是用Node JS编写的(我实际上不太了解它,所以可能是我的代码有问题)。代码如下:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
// const creds = "/Users/raeesali/Downloads/service.json";
const serviceAccount = require("/service.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://udhar-app-cb137-default-rtdb.asia-southeast1.firebasedatabase.app",
});
exports.sendNotification = functions.https.onCall((data, context) => {
try {
const token = data.token;
const payload = {
notification: {
title: data.title,
body: data.body,
clickAction: "FLUTTER_ACTION_CLICK",
},
};
return admin.messaging().sendToDevice(token, payload).then((response) => {
return {
success: true,
response: `Successful ${response}`,
};
}).catch((error) => {
return {
success: false,
response: `Error ${error}`,
};
});
} catch (error) {
console.log(`Some Error Occurred ${error}`);
return {
success: false,
response: `Error ${error}`,
};
}
});
然而,当我尝试部署这个函数时,我得到的错误说:
"错误:未能从源加载函数定义:未能从函数源生成清单:错误:无法找到模块'/service.json'">
文件确实存在,我甚至尝试过提供绝对路径仍然不工作。但是,根据几个教程,如果我只使用admin.initializeApp()行,则函数被成功部署,当函数被触发时,我得到这个响应作为一个异常。
"Error:尝试向FCM服务器进行身份验证时发生错误。确保用于验证此SDK的凭据具有适当的权限。请参阅https://firebase.google.com/docs/admin/setup获取安装说明。">
我试着通过提供绝对/相对路径来解决它,从来没有工作过。
删除了npm_modules/lock文件,仍然没有解决方案。
根据这个检查了我的gpc,一切都启用了,除了我从来没有确切地找到云消息来启用/禁用而不是Firebase云消息。
无法使用' initializeapp '部署Firebase函数
有两个问题:
代码中的错误配置
删除这一行:
const serviceAccount = require("/service.json");
您不需要为Cloud Functions指定任何凭据。默认情况下,它们在运行时服务帐户的上下文中运行,不需要身份验证。
然后改变这一行:
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://...-default-rtdb.asia-southeast1.firebasedatabase.app",
});
:
admin.initializeApp();
因为,这个上下文是在函数框架中自动拾取的,你不必指定它。
API配置缺失
- 打开Google Cloud Platform Dashboard 转到API和服务
- 启用API和服务
- 搜索云消息
- 打开云消息和Firebase云消息API
如果问题仍然存在,请确保您的Cloud Function的运行时服务帐户已被授予cloudmessaging.messages.create
IAM权限。