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

