В настоящее время я работаю над ботом для разногласий, который использует «discord.js», «discord.js-commando» и «snekfetch». Я пытаюсь создать функцию, в которой, если член гильдии наберет «!meme», бот разногласий возьмет случайный пост из r/dankmemes и отправит его на соответствующий канал с помощью richEmbed. однако при проверке функции появляются следующие сообщения об ошибках:
TypeError: Cannot read property 'nsfw' of undefined
TypeError: Cannot read property 'send' of undefined
Я пытался решить проблему в течение 4 дней, и я совершенно не знаю, что вызывает эту проблему. Согласно документации discord.js, это должно работать абсолютно нормально. Я прикрепил командный модуль ниже:
const Commando = require('discord.js-commando');
const Discord = require('discord.js');
const snekfetch = require('snekfetch');
class MemesRssCommand extends Commando.Command
{
constructor(client)
{
super(client,{
name: 'meme',
group: 'simple',
memberName: 'meme',
description: 'Takes a random meme from r/dankmemes'
});
}
async run(client, message, args) {
try {
const { body } = await snekfetch
.get('https://www.reddit.com/r/dankmemes.json?sort=top&t=week')
.query({ limit: 800 });
const allowed = message.channel.nsfw ? body.data.children : body.data.children.filter(post => !post.data.over_18);
if (!allowed.length) return message.channel.send('Our farmers were unable to locate any ripe memes! Try again later (You shouldnt see this message. If you are reading this, then reddit is probably offline. If reddit is online and you still get this message, contact @????????#1612');
const randomnumber = Math.floor(Math.random() * allowed.length)
const embed = new Discord.RichEmbed()
.setColor(0x00A2E8)
.setTitle(allowed[randomnumber].data.title)
.setDescription("Posted by: " + allowed[randomnumber].data.author)
.setImage(allowed[randomnumber].data.url)
.addField("Other info:", "Up votes: " + allowed[randomnumber].data.ups + " / Comments: " + allowed[randomnumber].data.num_comments)
.setFooter("Posted by: " + allowed[randomnumber].data.author + " | Memes provided by https://www.reddit.com/r/dankmemes")
message.channel.send(embed)
} catch (err) {
return console.info(err);
}
}
}
module.exports = MemesRssCommand
@Bucket проблема в том, что run принимает только два аргумента run(message, args).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Согласно пример в документации, обратный вызов для run — это run(message, args), но вы определяете его как run(client, message, args), поэтому message.channel не определено, поскольку вы пытаетесь получить к нему доступ не на том объекте.
async run(message, args) {
const member = args.member;
const channel = message.channel
// ....
}
Как указано в ошибке,
message.channelравноundefined. Проверьте значение второго аргумента, который вы передаете вrun().