Discord.js开发的机器人拉取MySQL数据发往Discord时显示undefined如何解决
问题原因&修复方案
1. SQL语法错误
你当前的SQL拼接逻辑没有给LIKE的匹配值加单引号,生成的SQL语句不符合MySQL语法规范,会直接触发查询错误,导致返回结果为undefined。
原拼接逻辑生成的错误SQL示例:SELECT * from hatalar WHERE hata_komut LIKE %测试报错%
正确的SQL需要给匹配值加单引号,同时建议使用参数化查询避免SQL注入风险。
2. 未做错误捕获处理
query回调的第一个参数为错误对象,你没有判断错误是否存在,查询失败时直接使用结果对象自然拿到undefined。
3. 未正确读取查询结果
mysql模块的查询返回结果是数组格式,就算查询成功,直接打印整个数组也无法拿到你需要的报错解答内容,需要根据你表内的字段名读取对应值。
4. 缺少发送消息到Discord的逻辑
你当前仅把结果打印到服务端控制台,没有调用Discord.js的消息发送方法,用户在频道内自然收不到回复。
修正后的参考代码
const Discord = require("discord.js"); const client = new Discord.Client(); const ayarlar = require("./ayarlar.json"); const mysql = require('mysql'); var baglanti = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'hatabot' }); baglanti.connect(function (err) { if (err) throw err; console.log("baglanti basarili") client.on('message', msg => { // 过滤机器人自己发的消息避免死循环 if (msg.author.bot) return; // 使用参数化查询避免SQL注入,同时解决SQL语法问题 const querySql = "SELECT * from hatalar WHERE hata_komut LIKE ?"; const queryParam = `%${msg.content}%`; baglanti.query(querySql, queryParam, function(err, sonuc){ // 先捕获查询错误 if (err) { console.error('查询出错:', err); return msg.reply('查询报错信息失败,请稍后再试'); } // 判断是否查到对应数据 if (sonuc.length === 0) { return msg.reply('没有找到对应报错的解答信息'); } // 读取第一条匹配结果的解答字段,注意把hata_icerik改成你实际表内存储解答的字段名 const cevap = sonuc[0].hata_icerik; console.log(`${msg.content} kelimesine ait\n\n${cevap}\n\nsonucu bulundu`); // 发送结果到Discord频道 msg.reply(cevap); }); }); }); client.login(ayarlar.token)
内容的提问来源于stack exchange,提问作者FuhrXr
相关产品推荐
相关产品推荐

