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

discord.js v14集成better-sqlite3报错TypeError: db.get is not a function求助

解决TypeError: db.get is not a function(better-sqlite3 + discord.js v14)

错误原因

你混淆了数据库库的API:better-sqlite3是原生SQLite操作库,没有get()、set()这类键值对风格的方法——这些是quick.db这类封装库的API。要操作SQLite数据库,必须用标准SQL语句来查询和修改数据。

解决步骤

1. 正确初始化数据库并创建表

首先确保你已正确初始化better-sqlite3,并提前创建存储数据的表:

const Database = require('better-sqlite3');
// 初始化数据库文件(不存在则自动创建)
const db = new Database('duty_status.db');

// 创建存储值班状态的表(如果不存在)
db.prepare(`CREATE TABLE IF NOT EXISTS duty_times (
    guild_id TEXT,
    user_id TEXT,
    timestamp INTEGER,
    PRIMARY KEY (guild_id, user_id) -- 确保每个用户在每个服务器只有一条记录
)`).run();

2. 替换错误的db.get()和db.set()为SQL操作

将你代码中的数据库操作替换为better-sqlite3的标准用法:

替换查询逻辑(原db.get())

// 用SQL查询用户是否已有值班记录
const getStatusQuery = db.prepare('SELECT timestamp FROM duty_times WHERE guild_id = ? AND user_id = ?');
const status = getStatusQuery.get(interaction.guild.id, interaction.user.id);

替换插入/更新逻辑(原db.set())

// 用INSERT OR REPLACE插入或更新记录(避免重复)
const setTimeQuery = db.prepare('INSERT OR REPLACE INTO duty_times (guild_id, user_id, timestamp) VALUES (?, ?, ?)');
setTimeQuery.run(interaction.guild.id, interaction.user.id, new Date().getTime());

3. 修改后的完整代码片段

const role = interaction.guild.roles.cache.get(config.on_duty_role);
const member = interaction.member;
await member.roles.add(role);

// 查询用户是否已有值班记录
const getStatusQuery = db.prepare('SELECT timestamp FROM duty_times WHERE guild_id = ? AND user_id = ?');
const status = getStatusQuery.get(interaction.guild.id, interaction.user.id);

if (status) {
    interaction.reply({
        embeds: [
            new EmbedBuilder({
                "description": "**🟢 Η κατάσταση σου είναι ήδη ενεργή 🟢**",
                "color": "#ffb600",
                "author": {
                    "name": interaction.user.username,
                    "url": "https://discord.com/users/" + interaction.user.id,
                    "icon_url": interaction.user.displayAvatarURL()
                }
            })
        ],
        ephemeral: true
    });
} else {
    interaction.reply({
        embeds: [
            new EmbedBuilder({
                "description": "**🟢 Η κατάσταση σου είναι ενεργή 🟢**",
                "color": "#ffb600",
                "author": {
                    "name": interaction.user.username,
                    "url": "https://discord.com/users/" + interaction.user.id,
                    "icon_url": interaction.user.displayAvatarURL()
                }
            })
        ],
        ephemeral: true
    });

    // 插入新的值班时间记录
    const setTimeQuery = db.prepare('INSERT OR REPLACE INTO duty_times (guild_id, user_id, timestamp) VALUES (?, ?, ?)');
    setTimeQuery.run(interaction.guild.id, interaction.user.id, new Date().getTime());
}

额外注意事项

  • better-sqlite3的核心API是同步的,不需要加await(除非使用异步扩展方法),不会阻塞Discord机器人的事件循环。
  • 确保已正确安装依赖:npm install better-sqlite3

内容的提问来源于stack exchange,提问作者Red.1111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:17:53