gpt4 book ai didi

javascript - 如何修复由于 React SSR 初始化数据库和云函数 firebase 初始化数据库而多次初始化的 firebase 数据库?

转载 作者:搜寻专家 更新时间:2023-10-31 22:46:36 24 4
gpt4 key购买 nike

我已经更新了问题,因为找到了问题的根本原因。由于我托管了我的 React SSR 应用程序,该应用程序在客户端使用 firebase 数据库,由名为 app 的云函数之一提供服务,并抛出错误 Error: FIREBASE FATAL ERROR: Database initialized multiple times。请确保数据库 URL 的格式与每个 database() 调用匹配。。当我一一注释掉并部署时,效果很好。但是当我一起部署时不起作用。我如何将这两者分开并保持在同一个存储库中?

原始问题:为什么 firebase 云函数会抛出“默认 Firebase 应用不存在”错误?所以我第一次尝试 firebase 功能。 admin.messaging() 抛出以下错误。帮我看看为什么?如果我查看控制台,我会得到结果,直到 console.log('deviceToken', deviceToken);

所以 const messageDone = await admin.messaging().sendToDevice(deviceToken, payload); 有什么问题?

const functions = require('firebase-functions');
const admin = require('firebase-admin');
exports.updateUnreadCount = functions.database.ref('/chats/{chatId}/{messageId}')
.onCreate(async(snap, context) => {
const appOptions = JSON.parse(process.env.FIREBASE_CONFIG);
appOptions.databaseAuthVariableOverride = context.auth;
const adminApp = admin.initializeApp(appOptions, 'app');
const { message, senderId, receiverUid } = snap.val();
console.log(message, senderId, receiverUid);
console.log('------------------------');
const deleteApp = () => adminApp.delete().catch(() => null);
try {
const db = adminApp.database();
const reciverUserRef = await db.ref(`users/${receiverUid}/contacts/${senderId}/`);
console.log('reciverUserRef', reciverUserRef);
const deviceTokenSnapshot = await reciverUserRef.child('deviceToken').once('value');
const deviceToken = await deviceTokenSnapshot.val();
console.log('deviceToken', deviceToken);

const payload = {
notification: {
title: 'Test Notification Title',
body: message,
sound: 'default',
badge: '1'
}
};
const messageDone = await admin.messaging().sendToDevice(deviceToken, payload);
console.log('Successfully sent message: ', JSON.stringify(messageDone));
return deleteApp().then(() => res);
} catch (err) {
console.log('error', err);
return deleteApp().then(() => Promise.reject(err));
}
});

更新1:根据这个https://firebase.google.com/docs/cloud-messaging/send-message#send_to_a_topic , admin.messaging().sendToDevice(deviceToken, payload) API 仅在 Admin Node.js SDK 中可用?所以切换到

const payload = {
data: {
title: 'Test Notification Title',
body: message,
sound: 'default',
badge: '1'
},
token: deviceToken
};
const messageDone = await admin.messaging().send(payload);

这也不起作用。收到错误 错误:默认的 Firebase 应用不存在。确保在使用任何 Firebase 服务之前调用 initializeApp()。任何线索都会有所帮助。

编辑:终于让功能正常工作了。我的 index.js 正在导出到函数,如下所示

exports.app = functions.https.onRequest(app); //React SSR
exports.updateChat = functions.database.ref('/chats/{chatId}/{messageId}').onCreate(updateChat);

exports.app 是一个 react ssr 函数,我用它来托管我的网站。这也使用数据库。并抛出 多个数据库实例 的错误。当我一一注释掉并部署时,效果很好。但是当我一起部署时不起作用。我如何将这两者分开并保持在同一个 repo 协议(protocol)中?有什么建议吗?

最佳答案

您可以在导出函数之外初始化数据库。

const admin = require('firebase-admin');
const adminApp = admin.initializeApp(appOptions, 'app')
//continue code

更新:

const admin = require('firebase-admin');
const adminApp = admin.initializeApp(options);
async function initialize(options, apps = 'app') {
try {
const defaultApp = adminApp.name
if(defaultApp) {
const adminApp1 = admin.initializeApp(apps);
}else {
const adminApp1 = admin.initializeApp(options, apps);
}
}catch(err) {
console.error(err);
}
}

根据您的需要修改此代码段并尝试一下

它在另一个函数中抽象了应用程序的初始化。只需在代码中的适当位置调用此函数即可。

关于javascript - 如何修复由于 React SSR 初始化数据库和云函数 firebase 初始化数据库而多次初始化的 firebase 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com