无法为 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 语句用于对数组或者对象的属性进行循环操作吗?

删除或隐藏动态创建的链接标签和标签

java去掉实体类的空属性

对于具有 NULL 值的循环变量

如何在 for 循环中创建具有整数值的 Checkbuttons?

如何在 C++ 中并行化一个 for 循环,只创建一次线程池