Firebase初始化顺序正确仍报app/no-options错误求助
解决FirebaseError: Need to provide options, when not being deployed to hosting via source问题
问题根源
你代码里存在两个关键错误:
- 混用Firebase SDK版本:同时导入了compat兼容版(
firebase/compat/*)和v9+模块化版(firebase/*)的API,导致SDK初始化逻辑冲突 - 过早调用数据库方法:在执行
initializeApp(firebaseConfig)初始化Firebase App之前,就调用了getDatabase(),此时SDK还未获取到配置参数,直接触发"no-options"错误
修复方案
方案1:统一使用Firebase v9+模块化SDK(推荐)
完全使用模块化API,按正确顺序初始化:
require('dotenv').config() const Discord = require('discord.js') const Commando = require('discord.js-commando') const { MessageAttachment } = require('discord.js') const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]}) // 只导入模块化版API const { initializeApp } = require('firebase/app') const { getAuth } = require('firebase/auth') const { getDatabase, onValue, ref } = require('firebase/database') const { debug } = require('console') const { get } = require('https') const querystring = require('querystring') const https = require('https') // Firebase配置 const firebaseConfig = { apiKey: "placeholder", authDomain: "placeholder-placeholder.firebaseapp.com", databaseURL: "https://placeholder-default-rtdb.europe-west1.firebasedatabase.app", projectId: "placeholder-placeholder", storageBucket: "placeholder.appspot.com", messagingSenderId: "placeholder", appId: "placeholder", measurementId: "placeholder" }; // 先初始化App,再获取数据库和Auth实例 const app = initializeApp(firebaseConfig); const auth = getAuth(app) const db = getDatabase(app) // 传入初始化后的app实例 const dbref = ref(db) module.exports = class ImageCommand extends Commando.Command { constructor(client) { super(client, { name: 'image', group: 'misc', memberName: 'image', description: 'Sends an image', }) } } client.on('ready', () => { console.log('Our bot is ready to go!!!') }) client.on("message", msg => { if(msg.content === 'keyword'){ try{ const infographicImageRef = ref(db, 'infographics/' + msg.content + '/keyword') // onValue是异步监听,将发送逻辑放在回调内 onValue(infographicImageRef, (snapshot) => { const imageUrl = snapshot.val() msg.channel.send(imageUrl) console.log('here2'); }) } catch(err){ console.log(err) } } }) client.login(process.env.BOT_TOKEN)
方案2:统一使用compat兼容版SDK
如果习惯旧版写法,全用compat包:
require('dotenv').config() const Discord = require('discord.js') const Commando = require('discord.js-commando') const { MessageAttachment } = require('discord.js') const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]}) // 只导入compat版API const firebase = require('firebase/compat/app') require('firebase/compat/database') require('firebase/compat/auth') const { debug } = require('console') const { get } = require('https') const querystring = require('querystring') const https = require('https') // Firebase配置 const firebaseConfig = { apiKey: "placeholder", authDomain: "placeholder-placeholder.firebaseapp.com", databaseURL: "https://placeholder-default-rtdb.europe-west1.firebasedatabase.app", projectId: "placeholder-placeholder", storageBucket: "placeholder.appspot.com", messagingSenderId: "placeholder", appId: "placeholder", measurementId: "placeholder" }; // 初始化App firebase.initializeApp(firebaseConfig); const auth = firebase.auth() const db = firebase.database() const dbref = db.ref() module.exports = class ImageCommand extends Commando.Command { constructor(client) { super(client, { name: 'image', group: 'misc', memberName: 'image', description: 'Sends an image', }) } } client.on('ready', () => { console.log('Our bot is ready to go!!!') }) client.on("message", msg => { if(msg.content === 'keyword'){ try{ const infographicImageRef = db.ref('infographics/' + msg.content + '/keyword') // 异步回调内处理发送逻辑 infographicImageRef.on('value', (snapshot) => { const imageUrl = snapshot.val() msg.channel.send(imageUrl) console.log('here2'); }) } catch(err){ console.log(err) } } }) client.login(process.env.BOT_TOKEN)
额外提示
你代码里还有一个逻辑问题:onValue是异步数据监听,原代码在调用onValue后立即执行msg.channel.send(imageUrl),此时imageUrl还未被赋值,会发送null。修复后的代码已将发送逻辑放在回调函数内,确保拿到数据后再执行发送操作。
内容的提问来源于stack exchange,提问作者LosmiNCL
相关产品推荐
相关产品推荐

