Sequelize与discord.js:如何将查询结果转为简易数组
我来帮你搞定这个问题!你现在遇到的核心问题有两个:一是没能从Sequelize的查询结果里正确提取出纯游戏模式名称数组,二是awaitMessages的过滤逻辑写错了,才导致了那个Invalid value Collection {}的报错。咱们一步步来解决:
问题分析与修复步骤
1. 正确提取Sequelize查询的名称数组
你之前的raw: true参数位置完全错了!Sequelize的findAll方法里,raw是第一个配置对象的属性,不是单独的第二个参数。所以你之前的newme拿到的还是Sequelize的模型实例数组,不是纯JSON数据,自然没法直接提取名称。
两种简洁的提取方式:
方式一:用findAll+map(兼容所有Sequelize版本)
const gamemodeNames = await gamemodes.findAll({ attributes: ['name'], raw: true // 把raw放在第一个配置对象里! }).then(results => results.map(item => item.name));
方式二:用pluck(更简洁,Sequelize内置方法)
const gamemodeNames = await gamemodes.pluck('name');
这样gamemodeNames就是一个纯字符串数组,比如['Normal', 'Hardcore', 'Survival'],完全符合你的需求。
2. 修复awaitMessages的过滤逻辑
你原来的msg => msg.content == newme.some()完全不符合语法!some()方法需要传入回调函数来判断元素是否匹配,而且你还要注意忽略机器人自己的消息,避免误触发。
修正后的过滤函数:
const filter = msg => { // 跳过机器人发送的消息,防止自己触发自己 if (msg.author.bot) return false; // 检查用户输入的内容是否在游戏模式名称数组里(trim去除空格) return gamemodeNames.includes(msg.content.trim()); };
同时,一定要给awaitMessages加上错误处理,避免出现未处理的Promise拒绝警告:
完整的修正代码
把所有修改整合起来,最终代码如下:
// 提取纯游戏模式名称数组 const gamemodeNames = await gamemodes.pluck('name'); // 处理没有游戏模式的边界情况 const modeList = gamemodeNames.join('\n') || "No Gamemodes yet!"; // 发送选择提示 await message.channel.send(`Okay! First, choose the gamemode you'd like to search in. List of gamemodes: **${modeList}**. You have 15 seconds, just post your choice here.`); // 定义消息过滤规则 const filter = msg => { if (msg.author.bot) return false; return gamemodeNames.includes(msg.content.trim()); }; try { const collectedMessages = await message.channel.awaitMessages(filter, { time: 15000, max: 1 }); // 处理超时情况 if (collectedMessages.size === 0) { return message.channel.send('⏱️ 时间到啦,你没有在规定时间内选择有效的游戏模式!'); } // 获取用户选择的游戏模式 const selectedGamemode = collectedMessages.first().content.trim(); // 这里可以添加查询该游戏模式相关信息的逻辑 await message.channel.send(`✅ 你选择了**${selectedGamemode}**,下面是相关选项和信息:`); // 示例:查询该模式的详细数据 // const modeDetails = await gamemodes.findOne({ where: { name: selectedGamemode } }); // await message.channel.send(`模式描述:${modeDetails.description}`); } catch (error) { console.error('处理请求时出错:', error); message.channel.send('❌ 处理你的请求时出现了错误,请稍后重试!'); }
为什么原来的代码会报错?
raw: true参数位置错误,导致newme是模型实例数组而非纯数据,无法直接用于判断用户输入;awaitMessages的过滤逻辑完全错误,msg.content == newme.some()既不符合some()的语法,也无法正确判断用户输入是否有效,最终触发了Sequelize的无效值错误。
内容的提问来源于stack exchange,提问作者Mxm
相关产品推荐
相关产品推荐

