我的 Discord 机器人的可自定义欢迎频道功能不起作用,它看起来像是 MongoDB 的问题,但我无法弄清楚

Posted

技术标签:

【中文标题】我的 Discord 机器人的可自定义欢迎频道功能不起作用,它看起来像是 MongoDB 的问题,但我无法弄清楚【英文标题】:My customizable welcome channel feature for my Discord bot isn't working, it looks like a problem with MongoDB but I'm unable to figure it out 【发布时间】:2021-11-22 23:57:25 【问题描述】:

我的 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' &&
            channel.type !== 'GUILD_NEWS' &&
            channel.type !== 'GUILD_NEWS_THREAD' &&
            channel.type !== 'GUILD_PUBLIC_THREAD' &&
            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)

请帮帮我,提前谢谢!

【问题讨论】:

欢迎来到 Stack Overflow!请不要发布大量代码或完整的错误消息,尽量更具体,以便我们更好更快地为您提供帮助。 你能不能 console.log(data) @Zero console.log(data) console.log(welcomeData[member.guild.id]) 我在data[0].send 行上方插入了这些代码行,它记录了[ undefined, undefined ] [ undefined, undefined ] 当然,很明显它无法推送数据本身,所以你可能想调试并检查你的实际猫鼬连接中发生了什么,为什么数据undefined 【参考方案1】:

const welcomeChannelId, welcomeText = results 替换为const welcomeChannelId, welcomeText = results[0],因为结果是一个数组

使用const results = await schema.findOne( _id: member.guild.id )results 只是一个对象

【讨论】:

【参考方案2】:

这可能是因为 data 是一个数组/对象并且没有发送方法。您需要先找到频道,然后再发送类似

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

【讨论】:

但我确实这样做了,我使用 id 获取频道并将 频道 存储在 data[0] 可以,但不能发送到字符串。您需要在 discord.js 中获取频道才能发送给它【参考方案3】:

这意味着message 是nullish。确保论点确实存在。有3种方式:

    使斜线命令选项必需(推荐) 如果找不到参数,则提前返回
if (!message) return; //after the 'message' declaration
    设置默认值,这里使用logical OR operator(nullish coalescing operator 也可以)
const message = await interaction.options.getString('message') || "Welcome to the server!"

【讨论】:

但是channelmessage 都是必需的,那么为什么会出现错误? 您是否正确设置了标签? wdym by "label"? 你能展示一下你是如何创建斜杠命令而不是架构的吗? 我提供了setwelcome.js文件,这是我的斜杠cmd文件

以上是关于我的 Discord 机器人的可自定义欢迎频道功能不起作用,它看起来像是 MongoDB 的问题,但我无法弄清楚的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 频道未定义欢迎消息

Discord.js v12.0.1 频道未定义

使用 tweepy 和 discord.py 将推文发布到特定频道

使用 Discord.js 使用 Discord Bot 将语音频道中的所有人静音

使用 discord.js 从不同服务器向多个频道 ID 发送消息

Discord制作需要确认的频道机器人