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

Firebase初始化顺序正确仍报app/no-options错误求助

解决FirebaseError: Need to provide options, when not being deployed to hosting via source问题

问题根源

你代码里存在两个关键错误:

  1. 混用Firebase SDK版本:同时导入了compat兼容版(firebase/compat/*)和v9+模块化版(firebase/*)的API,导致SDK初始化逻辑冲突
  2. 过早调用数据库方法:在执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:10:12