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

Node.js操作MySQL返回[Object],JSON.stringify无效的Discord Bot问题

解决Discord Bot查询MySQL返回[object Object]的问题

嘿,我刚看完你的问题,这情况我之前也碰到过,给你捋捋怎么搞定:

首先,为啥会出现[object Object]?因为rows其实是一个对象数组,每个元素都是包含Name属性的对象(比如[{ Name: "战士" }, { Name: "法师" }])。Discord的message.reply()没办法直接解析这种对象结构,所以就显示成了默认的[object Object]。

你用JSON.stringify(rows)没生效,核心问题是没把转换后的结果存下来就发送了——你只是调用了方法,但没把返回值传给message.reply(),相当于白忙活了一场。

给你两个解决方案,按需选:

方案1:正确使用JSON.stringify

如果就是想返回JSON格式的结果,得把转换后的字符串赋值给变量再发送:

con.query(`SELECT Name FROM ${message.author.username}list`, (err, rows) => {
  if(err) throw err;
  // 把转换后的结果存到变量里
  const jsonResult = JSON.stringify(rows);
  // 发送这个变量
  message.reply(jsonResult);
})

方案2:提取角色名,友好展示给用户

这种方式更符合Discord的聊天场景,用户看着也舒服:

con.query(`SELECT Name FROM ${message.author.username}list`, (err, rows) => {
  if(err) throw err;
  
  // 先判断有没有结果
  if (rows.length === 0) {
    return message.reply("你还没有任何角色哦!");
  }
  
  // 遍历数组,提取每个对象里的Name字段,转成带项目符号的列表
  const roleList = rows.map(row => `- ${row.Name}`).join('\n');
  message.reply(`你的角色列表:\n${roleList}`);
})

这样发送后,用户看到的会是:

你的角色列表:

  • 战士
  • 法师

额外提醒:注意SQL注入风险

你直接用${message.author.username}作为表名,这是很危险的!如果有人改了用户名带特殊SQL字符,可能会攻击你的数据库。建议先对用户名做转义处理:

// 用connection.escape转义,再去掉前后的引号
const safeTableName = con.escape(`${message.author.username}list`).replace(/'/g, '');
con.query(`SELECT Name FROM ${safeTableName}`, (err, rows) => {
  // 后续代码不变
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:02:25