无法为 for 循环中具有 null 属性的内容创建正确的 if 语句
Posted
技术标签:
【中文标题】无法为 for 循环中具有 null 属性的内容创建正确的 if 语句【英文标题】:Can't make a proper if statement for something with a property of null in a for loop 【发布时间】:2021-10-17 03:55:38 【问题描述】:为我的 discord.js 机器人编写警告命令,并添加了一个功能,以便 lw
命令返回来自指定用户的警告列表。
代码运行良好,但如果我 ping 一个没有任何警告的用户,机器人会收到一条错误消息 cannot read property of null
我使用 mongoDB 作为我的数据库。
这是命令本身的代码,(使用在另一个文件中可以正常工作的高级命令处理程序):
const Discord = require('discord.js')
const mongo = require('../../mongo')
const warnSchema = require('../../schemas/warn-schema')
module.exports =
commands: ['listwarnings', 'listwarns', 'listwarn', 'lw'],
minArgs: 1,
expectedArgs: "<Target user's @>",
callback: async (message, arguments, text) =>
const target = message.mentions.users.first()
if (!target)
const noPingListWarns = new Discord.MessageEmbed()
.setDescription('Please specify a valid user to tag.')
message.channel.send(noPingListWarns)
return
const guildId = message.guild.id
const userId = message.member.id
await mongo().then(async (mongoose) =>
try
const results = await warnSchema.findOne(
guildId,
userId
)
let reply = `Previous warnings for <@$target>:\n\n`
for (const warning of results.warnings)
const author, timestamp, reason = warning
reply += `By $author on $new Date(timestamp).toLocaleDateString() for "$reason"\n\n`
const listWarningsReply = new Discord.MessageEmbed()
.setDescription(reply)
message.channel.send(listWarningsReply)
finally
mongoose.connection.close()
)
我希望机器人回复说message.channel.send(
has 0 warns.` 在 if 语句中,条件是 if warns = 0。我试图在 for 循环之外创建一个 if 语句,在里面还是不行……
如果有任何帮助,这里是我用于 mongoDB 的架构中的代码:
const mongoose = require('mongoose')
const warnSchema = mongoose.Schema(
guildId:
type: String,
required: true
,
userId:
type: String,
required: true
,
warnings:
type: [Object],
required: true
)
module.exports = mongoose.model('warnings', warnSchema)
请指教。
【问题讨论】:
【参考方案1】:这里
const results = await warnSchema.findOne(
guildId,
userId
)
let reply = `Previous warnings for <@$target>:\n\n`
for (const warning of results.warnings)
const author, timestamp, reason = warning
reply += `By $author on $new Date(timestamp).toLocaleDateString() for "$reason"\n\n`
你可以检查它是否为空(我不知道究竟什么是空你没有提供足够的信息)
const results = await warnSchema.findOne(
guildId,
userId
)
if(!results?.warnings?.length) return message.channel.send(`<@$target> has 0 warns.`);
//I assume results.warnings.length is 0 if there are none
let reply = `Previous warnings for <@$target>:\n\n`
for (const warning of results.warnings)
const author, timestamp, reason = warning
reply += `By $author on $new Date(timestamp).toLocaleDateString() for "$reason"\n\n`
【讨论】:
以上是关于无法为 for 循环中具有 null 属性的内容创建正确的 if 语句的主要内容,如果未能解决你的问题,请参考以下文章
JS中for...in 语句用于对数组或者对象的属性进行循环操作吗?