Discord.js+MySQL机器人如何发送数据库内容而非[object Object]
问题核心成因
你直接将MySQL查询返回的对象数组传入message.channel.send(),Discord.js对非字符串类型的入参会做隐式类型转换,将原生JS对象转为默认字符串表示[object Object],因此无法展示数据库存储的实际字段内容。
落地修复方案
- 对查询返回的结果做结构化处理,手动提取对象中的字段值,拼接为Discord可识别的纯文本或Embed结构,禁止直接传递原始数据库结果对象
- 补充查询错误、空结果的分支判断,避免数据库异常时机器人进程崩溃
- 优先使用Embed组件承载数据库内容,结构化展示的可读性远优于纯文本
修正后可运行代码
const { MessageEmbed } = require('discord.js'); const { MESSAGES } = require('../../utility/constants'); const mysql = require("mysql"); const db = mysql.createConnection({ host: "localhost", port: "3306", user: "root", password: "root", database: "devoirs", }) db.connect(function (err) { if(err) throw err; console.log('Connecter a la BDD') }) module.exports.run = (bot, message, args) => { db.query("SELECT * FROM devfr ", function (err, resultRows){ // 捕获数据库查询异常 if (err) { message.channel.send('数据库查询出现异常,请稍后重试'); return; } // 处理无查询结果的场景 if (!resultRows || resultRows.length === 0) { message.channel.send('当前数据库暂无对应记录'); return; } // 构建结构化Embed展示内容 const resultEmbed = new MessageEmbed() .setTitle('法语作业数据库记录') .setColor('#2f3136'); // 遍历查询结果,提取每行的实际字段值(需替换为你表中的真实字段名) resultRows.forEach((row, rowIndex) => { resultEmbed.addField( `第${rowIndex + 1}条记录`, `科目:${row.subject}\n作业内容:${row.content}\n截止日期:${row.deadline}` ) }) // 传入结构化的Embed对象,而非原始数据库结果 message.channel.send({ embeds: [resultEmbed] }) }) }; module.exports.help = MESSAGES.COMMANDS.COMMANDES.DEVOIRS;
补充注意事项
- 代码Embed部分的
row.subject、row.content、row.deadline为示例字段,需要替换为你devfr表中实际存在的字段名,才能正确读取数据库存储的内容 - 如果偏好纯文本发送,可将结果拼接为字符串后传入send方法,示例:
const sendText = resultRows.map(row => `[${row.deadline}] ${row.subject}:${row.content}`).join('\n'); message.channel.send(sendText); - *核心逻辑始终是:必须手动从数据库返回的行对象中提取对应字段的实际值,拼接为Discord可识别的结构,不能直接将原始行对象传入发送方法
内容的提问来源于stack exchange,提问作者Mr Bonsoir
相关产品推荐
相关产品推荐

