Не могу сделать правильный оператор if для чего-либо со свойством null в цикле for

#mongodb #mongoose #discord.js

Вопрос:

Кодирование команды предупреждения для моего discord.js бот, и я добавил функцию, чтобы lw команда возвращала список предупреждений от указанного пользователя.

Код работает хорошо, но если я пропингую пользователя, у которого нет предупреждений, бот получит сообщение об ошибке 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}>:nn`

                for (const warning of results.warnings) {

                    const { author, timestamp, reason } = warning

                    reply  = `By ${author} on ${new Date(timestamp).toLocaleDateString()} for "${reason}"nn`
                }

                const listWarningsReply = new Discord.MessageEmbed()
                .setDescription(reply)
                message.channel.send(listWarningsReply)
            } finally {
                mongoose.connection.close()
            }
        })
    }
}
 

Я хочу, чтобы бот ответил, что message.channel.send( <@${target}> имеет 0 предупреждений.` в операторе if, где условие состоит в том, что if предупреждает = 0. Я попытался сделать оператор if вне цикла for и внутри него, но он все еще не работает…

Если это вам поможет, вот код из схемы, которую я использовал для 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}>:nn`

                for (const warning of results.warnings) {

                    const { author, timestamp, reason } = warning

                    reply  = `By ${author} on ${new Date(timestamp).toLocaleDateString()} for "${reason}"nn`
                }
 

Вы можете проверить, является ли оно нулевым (я не знаю, что именно является нулевым, вы не предоставили достаточно информации).

 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}>:nn`

                for (const warning of results.warnings) {

                    const { author, timestamp, reason } = warning

                    reply  = `By ${author} on ${new Date(timestamp).toLocaleDateString()} for "${reason}"nn`
                }