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

使用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);
  });

关键改进说明

  1. 参数化查询:用?作为占位符,把实际值放在数组里传给get和run方法,SQLite会自动处理引号转义,既解决了JSON字符串导致的语法错误,又彻底避免了SQL注入风险。
  2. 完善错误处理:给每个异步操作都加上.catch捕获异常,方便你调试定位问题。
  3. 补充边界逻辑:增加了用户不存在时的插入逻辑,让代码逻辑更完整(如果你的业务不需要可以直接删掉这部分)。

另外如果你用的是sqlite3库,这种参数化写法是原生支持的;如果是其他SQLite封装库,语法可能略有差异,但核心思路都是用参数绑定替代字符串拼接。

内容的提问来源于stack exchange,提问作者Saelvarath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:14:26