#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`
}