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
相关产品推荐
相关产品推荐

