使用Discord.js开发Discord机器人时,SQLite模板字面量引发未识别令牌错误
修复你的Discord.js+SQLite代码问题
我来帮你排查这段代码的核心问题哈,你的代码主要在SQL语句的写法上踩了两个坑,导致执行出错或者有安全风险:
- SQL语法冲突+注入风险:直接把JSON字符串
${nufu}和用户ID${message.author.id}拼进SQL语句里,JSON自带的双引号会破坏SQL的语法结构,同时这种写法还会留下严重的SQL注入漏洞。 - 代码不完整:你提供的代码最后
message.author....截断了,不过这是次要问题,核心还是SQL的写法错误。
修正后的完整代码示例
// 假设foo是你已经定义好的类 sql.get(`SELECT * FROM scores WHERE userId = ?`, [message.author.id]) .then(row => { if (row) { const nufu = JSON.stringify(new foo()); // 用参数化查询替代字符串拼接,彻底解决语法和安全问题 sql.run(`UPDATE scores SET object = ? WHERE userId = ?`, [nufu, message.author.id]) .then(() => { console.log("用户数据更新成功"); }) .catch(err => { console.error("更新数据时出错:", err); }); } else { // 可选:如果用户在表中不存在,补充插入新数据的逻辑 sql.run(`INSERT INTO scores (userId, object) VALUES (?, ?)`, [message.author.id, JSON.stringify(new foo())]) .then(() => { console.log("新用户数据插入成功"); }) .catch(err => { console.error("插入数据时出错:", err); }); } }) .catch(err => { console.error("查询用户数据时出错:", err); });
关键改进说明
- 参数化查询:用
?作为占位符,把实际值放在数组里传给get和run方法,SQLite会自动处理引号转义,既解决了JSON字符串导致的语法错误,又彻底避免了SQL注入风险。 - 完善错误处理:给每个异步操作都加上
.catch捕获异常,方便你调试定位问题。 - 补充边界逻辑:增加了用户不存在时的插入逻辑,让代码逻辑更完整(如果你的业务不需要可以直接删掉这部分)。
另外如果你用的是sqlite3库,这种参数化写法是原生支持的;如果是其他SQLite封装库,语法可能略有差异,但核心思路都是用参数绑定替代字符串拼接。
内容的提问来源于stack exchange,提问作者Saelvarath
相关产品推荐
相关产品推荐

