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

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('❌ 处理你的请求时出现了错误,请稍后重试!');
}

为什么原来的代码会报错?

  1. raw: true参数位置错误,导致newme是模型实例数组而非纯数据,无法直接用于判断用户输入;
  2. awaitMessages的过滤逻辑完全错误,msg.content == newme.some()既不符合some()的语法,也无法正确判断用户输入是否有效,最终触发了Sequelize的无效值错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:29:00