Моя настраиваемая функция канала приветствия для моего бота Discord не работает, похоже, что проблема с MongoDB, но я не могу ее решить

#javascript #node.js #mongodb #mongoose #discord.js

Вопрос:

Моя настраиваемая функция канала приветствия для моего бота Discord не работает. Я использую MongoDB, чтобы сделать его настраиваемым для каждого сервера.

Есть 3 соответствующих файла: welcome.js (файл моей схемы), guildMemberAdd.js (файл моего события) и setwelcome.js (команда, которую я использую для настройки канала приветствия.)

Файл welcome.js :

 const mongoose = require('mongoose');


const schema = mongoose.Schema({
    _id: {
    type: String,
    required: true
  },
  welcomeChannelId: {
    type: String,
    required: true
  },
  welcomeText: {
    type: String,
    required: true
  }
});

module.exports = mongoose.model('welcome', schema);
 

Файл guildMemberAdd.js :

 const { MessageEmbed } = require('discord.js');
const schema = require('../models/welcome.js')

const welcomeData = {}

module.exports = {
    name: 'guildMemberAdd',
    async execute(member) {
        const g = member.guild;
        const ms = require('ms');
        const timeSpan = ms('10 days');

        //Alt detection
        const createdAt = new Date(member.user.createdAt).getTime();
        const difference = Date.now() - createdAt;

        if (difference < timeSpan) {
            member.send('Bye, alt.');
            member.ban({ reason: 'This is an alt.' });
        }

        //Welcome Users
    
    let data = welcomeData[member.guild.id]
    if (!data) {
      const results = await schema.find({
        _id: member.guild.id
      })
      if (!results) {
        return
      }

      const { welcomeChannelId, welcomeText } = results
      const channel = member.guild.channels.cache.get(welcomeChannelId)
      data = welcomeData[member.guild.id] = [channel, welcomeText]
    }

    data[0].send({
      content: data[1].replace(/@/g, `<@${member.id}>`)
    })


    },
};
 

Файл setwelcome.js

 const { MessageEmbed } = require('discord.js');
const schema = require('../../models/welcome.js')

module.exports = {
    name: 'setwelcome',
    description: 'Sets the welcome message for the server.',
  options: [{
    name: 'channel',
    description: 'The channel to set as the welcome channel.',
    type: 'CHANNEL',
    required: true
  },
  {
    name: 'message',
    description: 'The welcome message.',
    type: 'STRING',
    required: true
  }],
    async execute(interaction) {
        const channel = await interaction.options.getChannel('channel')
    const message = await interaction.options.getString('message')

    if (
            channel.type !== 'GUILD_TEXT' amp;amp;
            channel.type !== 'GUILD_NEWS' amp;amp;
            channel.type !== 'GUILD_NEWS_THREAD' amp;amp;
            channel.type !== 'GUILD_PUBLIC_THREAD' amp;amp;
            channel.type !== 'GUILD_PRIVATE_THREAD'
        )
            return interaction.reply('That is not a valid channel type.');


    await schema.findOneAndUpdate({
      _id: interaction.guild.id,
    },
    {
      _id: interaction.guild.id,
      welcomeChannelId: channel.id,
      welcomeText: message   
    },
    {
      upsert: true
    })

    await interaction.reply(`Welcome channel is set to ${channel} and welcome message is set to `${message}`.`)
    },
};
 

Когда новый член вступает в гильдию, он выдает эту ошибку:

  /home/runner/MultiBot/events/guildMemberAdd.js:38
 data[0].send({
            ^

TypeError: Cannot read properties of undefined (reading 'send')
    at Object.execute (/home/runner/MultiBot/events/guildMemberAdd.js:38:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
 

Пожалуйста, помогите мне, заранее спасибо!

Комментарии:

1. Добро пожаловать в Stack Overflow! Пожалуйста, воздержитесь от публикации большого количества кода или полного сообщения об ошибке, постарайтесь быть более конкретными, чтобы мы могли помочь вам лучше и быстрее.

2. Можете ли вы console.log(данные)

3.@Zero console.log(data) console.log(welcomeData[member.guild.id]) Я вставил эти строки кода чуть выше data[0].send строки, и он регистрируется [ undefined, undefined ] [ undefined, undefined ]

4. Ну, конечно, тогда совершенно ясно, что он не может сам передавать данные, поэтому вы можете отладить и проверить, что происходит в вашем реальном соединении с мангустом, почему именно данные undefined

Ответ №1:

Это означает, что message это нулевое значение. Убедитесь, что аргумент действительно существует. Есть 3 способа:

  1. Выполнение необходимых параметров команды косой черты (рекомендуется)
  2. Возвращаемся раньше, если аргумент не найден
 if (!message) return; //after the 'message' declaration
 
  1. Установив значение по умолчанию, при этом используется логический оператор ИЛИ (также будет достаточно оператора объединения с нулевым значением).
 const message = await interaction.options.getString('message') || "Welcome to the server!"
 

Комментарии:

1. Но и channel то и message другое требуется, тогда почему ошибка?

2. Правильно ли вы устанавливаете метку?

3. wdym по «ярлыку»?

4. можете ли вы показать, как вы создаете команды косой черты вместо схемы, пожалуйста?

5. Я предоставил setwelcome.js файл, который является моим файлом cmd с косой чертой

Ответ №2:

Это может быть связано с тем, что данные являются массивом/объектом и не имеют метода отправки. Вам нужно будет найти канал, прежде чем отправлять его с чем-то вроде

 const channel = await client.channels.fetch(welcomeChannelId);
 

Комментарии:

1. Но я сделал это, я выбрал канал, используя идентификатор, и сохранил канал в data[0]

2. Да, но вы не можете отправить на строку. вам нужно ввести канал в discord.js чтобы иметь возможность отправлять на него

Ответ №3:

заменить const { welcomeChannelId, welcomeText } = results на const { welcomeChannelId, welcomeText } = results[0] как результаты-это массив

или

используйте const results = await schema.findOne({ _id: member.guild.id }) , чтобы results был только один объект