TypeError: "warnInfo" is not iterable报错及wio.db不兼容db.get解决方案咨询
报错原因与解决方案
核心问题说明
你遇到的TypeError: "warnInfo" is not iterable报错由两个问题共同导致:
- 数组对比逻辑错误:JS中数组为引用类型,
warnInfo == []永远返回false,即使warnInfo实际为空也无法触发你写的兜底返回逻辑 - wio.db的
fetch方法在对应键不存在时返回null而非空数组,非数组类型无法被for...of循环遍历
修复方案
不需要更换数据库,也不需要用到不兼容的get方法,仅需对fetch返回值做兼容处理、修正空值判断逻辑即可:
- 对
fetch返回的warnInfo做兼容处理,非数组类型统一转换为空数组 - 修正空值判断逻辑,直接判断warnInfo的长度是否为0即可
修改后的完整代码
const Discord = require("discord.js") const db = require("wio.db") module.exports = { kod: "warns", async run (client, message, args) { let user; if(!args[0]) user = message.author if(args[0] && isNaN(args[0])) user = message.mentions.users.first() if(args[0] && !isNaN(args[0])){ user = client.users.cache.get(args[0]) if(!message.guild.members.cache.has(args[0])) return message.reply(":x: User not found.") } if(!user) return message.reply(":x: You must tag a user") const number = db.fetch(`number.${user.id}.${message.guild.id}`) // 对返回值做兼容处理,非数组统一转为空数组 const warnInfo = db.fetch(`info.${user.id}.${message.guild.id}`) || [] // 修正空判断逻辑 if(!number || !warnInfo.length) return message.reply("Doesn't have warn") const warnembed = new Discord.MessageEmbed() for(let warnings of warnInfo){ let mod = warnings.moderator let reason = warnings.reason let date = warnings.date warnembed.addField(`${user.tag} warns`,`**Moderator:** ${mod}\n**Reason:** ${reason} \n**Date:** ${date}\n**Warn ID:** \`${warnings.id}\``,true) } warnembed.setColor(message.guild.members.cache.get(user.id).roles.highest.color) message.channel.send(warnembed) } }
内容的提问来源于stack exchange,提问作者hazzard
相关产品推荐
相关产品推荐

