javascript - Discord.js - TypeError:无法读取未定义的属性“声音”。有人可以告诉我我做错了什么吗?
问题描述
这是我从 Source Bin 获得的 play.js 文件。如果有人可以帮助我,那将不胜感激。
const ytdl = require("ytdl-core");
const ytSearch = require("yt-search");
//Global queue for your bot. Every server will have a key and value pair in this map. { guild.id, queue_constructor{} }
const queue = new Map();
module.exports = {
name: "play",
aliases: ["skip", "stop"],
cooldown: 0,
description: "Advanced music bot",
async execute(message, args, cmd, client, Discord) {
//Checking for the voicechannel and permissions (you can add more permissions if you like).
const voice_channel = message.member.voice.channel;
if (!voice_channel) return message.channel.send("You need to be in a channel to execute this command!");
const permissions = voice_channel.permissionsFor(message.client.user);
if (!permissions.has("CONNECT")) return message.channel.send("You dont have the correct permissins");
if (!permissions.has("SPEAK")) return message.channel.send("You dont have the correct permissins");
//This is our server queue. We are getting this server queue from the global queue.
const server_queue = queue.get(message.guild.id);
//If the user has used the play command
if (cmd === "play") {
if (!args.length) return message.channel.send("You need to send the second argument!");
let song = {};
//If the first argument is a link. Set the song object to have two keys. Title and URl.
if (ytdl.validateURL(args[0])) {
const song_info = await ytdl.getInfo(args[0]);
song = { title: song_info.videoDetails.title, url: song_info.videoDetails.video_url };
} else {
//If there was no link, we use keywords to search for a video. Set the song object to have two keys. Title and URl.
const video_finder = async (query) => {
const video_result = await ytSearch(query);
return video_result.videos.length > 1 ? video_result.videos[0] : null;
};
const video = await video_finder(args.join(" "));
if (video) {
song = { title: video.title, url: video.url };
} else {
message.channel.send("Error finding video.");
}
}
//If the server queue does not exist (which doesn't for the first video queued) then create a constructor to be added to our global queue.
if (!server_queue) {
const queue_constructor = {
voice_channel: voice_channel,
text_channel: message.channel,
connection: null,
songs: [],
};
//Add our key and value pair into the global queue. We then use this to get our server queue.
queue.set(message.guild.id, queue_constructor);
queue_constructor.songs.push(song);
//Establish a connection and play the song with the vide_player function.
try {
const connection = await voice_channel.join();
queue_constructor.connection = connection;
video_player(message.guild, queue_constructor.songs[0]);
} catch (err) {
queue.delete(message.guild.id);
message.channel.send("There was an error connecting!");
throw err;
}
} else {
server_queue.songs.push(song);
return message.channel.send(` **${song.title}** added to queue!`);
}
} else if (cmd === "skip") skip_song(message, server_queue);
else if (cmd === "stop") stop_song(message, server_queue);
},
};
const video_player = async (guild, song) => {
const song_queue = queue.get(guild.id);
//If no song is left in the server queue. Leave the voice channel and delete the key and value pair from the global queue.
if (!song) {
song_queue.voice_channel.leave();
queue.delete(guild.id);
return;
}
const stream = ytdl(song.url, { filter: "audioonly" });
song_queue.connection.play(stream, { seek: 0, volume: 0.5 }).on("finish", () => {
song_queue.songs.shift();
video_player(guild, song_queue.songs[0]);
});
await song_queue.text_channel.send(` Now playing **${song.title}**`);
};
const skip_song = (message, server_queue) => {
if (!message.member.voice.channel) return message.channel.send("You need to be in a channel to execute this command!");
if (!server_queue) {
return message.channel.send(`There are no songs in queue `);
}
server_queue.connection.dispatcher.end();
};
const stop_song = (message, server_queue) => {
if (!message.member.voice.channel) return message.channel.send("You need to be in a channel to execute this command!");
server_queue.songs = [];
server_queue.connection.dispatcher.end();
};
错误信息:
TypeError: Cannot read property 'voice' of undefined
const voice_channel = message.member.voice.channel;
^
我怎么称呼我的execute()
:
module.exports = (Discord, client, message) => {
const prefix = "-";
if (!message.content.startsWith(prefix) || message.author.bot) return;
const args = message.content.slice(prefix.length).split(/ +/);
const cmd = args.shift().toLowerCase();
const command = client.commands.get(cmd) || client.commands.find((a) => a.aliases && a.aliases.includes(cmd));
if (command) command.execute(client, message, args, Discord);
};
有谁知道我做错了什么?
解决方案
Message#member
可以是null
如果消息是在 DM 中发送的。
要修复此错误,请确保该命令不能在 DM 中使用:
async execute(message, args, cmd, client, Discord) {
if (!message.guild) return message.channel.send("This command doesn't work in DMs!");
// rest of code...
}
推荐阅读
- java - 从访问数据库选择行更新记录java swing
- reactjs - Gatsby XSS 预防
- php - 导航栏中断 PHP 重定向
- r - 在 r 中的索引处汇总向量列表的列表
- html - 如何使用 Angular 6 选择文件夹路径
- c# - Docker 工具箱 MongoDB C# TimeoutException
- java - 针对泛型和特定类型或该类型列表的灵活 JAXB XML 解析
- javascript - TypeScript 函数返回多个选项
- windows - 是否有适用于 Linux 的 Windows 子系统的可移植版本
- spring - 如何在一个应用程序中将tomcat配置为两个不同的域?