【问题标题】:Issue with Discord.js voice playerDiscord.js 语音播放器的问题
【发布时间】:2021-11-16 12:46:57
【问题描述】:

我一直在尝试在 discord.js 上为我的 DnD 组设置一个简单的音乐机器人,我可以让它提取命令、加入服务器和搜索 YouTube 视频,但我无法让它在语音频道上播放,给我一个 *Cannot read properties of undefined (reading 'once')。我刚刚开始编写代码,这完全让我难过。

这是播放代码和index.js 文件。我可能遗漏了一些明显的问题,我们将不胜感激!

播放代码:

const ytdl = require('ytdl-core');

const ytSearch = require('yt-search');

const {
  createAudioPlayer,
  createAudioResource,
  AudioPlayer,
  VoiceConnection,
  joinVoiceChannel
} = require('@discordjs/voice');
const { VoiceChannel } = require('discord.js');

const player = createAudioPlayer();

const resource = createAudioResource('ytdl');

module.exports = {
    name: 'play',
    description: 'Plays video',
    async execute(message, args) {
        const voiceChannel = message.member.voice.channel;
        if (!voiceChannel) return message.channel.send('I cannot enter the tavern!');
        const permissions = voiceChannel.permissionsFor(message.client.user);
        if (!permissions.has('CONNECT')) return message.channel.send('I cannot reach you!');
        if (!permissions.has('SPEAK')) return message.channel.send('I cannot hear you!');
        if (!args.length) return message.channel.send('You need to tell me the song!');
        const videoFinder = async (query) => {
          const videoResult = await ytSearch(query);
          return (videoResult.videos.length > 1) ? videoResult.videos[0] : null;
        }
        const video = await videoFinder(args.join(' '));
        if(video){
            const stream = ytdl(video.url, {filter: 'audioonly'});
           player.play ( stream, { seek: 0, volume: .5 })
          ;
          connection.subscribe(player);
         await message.reply(`:thumbsup: Now Playing ***${video.title}***`)
        } else {
         message.channel.send(`No video results found`);
        }
    }
    
}

index.js:

console.clear();

const fs = require('fs');

const { Client, Collection, Intents, DiscordAPIError } = require('discord.js');
const { prefix, token } = require('./config.json');

const client = new Client({ intents: [32767] });

client.commands = new Collection();
client.slashCommands = new Collection();

const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));
for (const file of commandFiles) {
    const command = require(`./commands/${file}`);
    client.commands.set(command.data.name, command);
}

client.once('ready', () => {
    console.log('The Nymph awakens.');
});


client.on('message', message => {
    if(!message.content.startsWith(prefix) || message.author.bot) return;
  
    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();


    if(command === "ping") {
        client.commands.get('ping').execute(message, args);} else if (command === "play") {
            client.commands.get('play').execute(message, args);
          } else if (command === "leave") {
            client.commands.get('leave').execute(message, args);
          }
        
         
         if(message.content === '!join') {
            const voiceChannel = message.member.voice.channel;
           if (!voiceChannel) return message.channel.send('I cannot enter the tavern!');
           joinVoiceChannel({
             channelId: message.member.voice.channel.id,
             guildId: message.guild.id,
              adapterCreator: message.guild.voiceAdapterCreator
                  })
              }
          
        
        
        
          if(command === "hello") {
            message.channel.send('You wish to speak?');
          } else if (command == 'goodbye') {
            message.channel.send("See you on the morrow.");
          } else if (command == 'hey') {
            message.channel.send("I wish not for hay."); 
          } else if (command == 'hi') {
            message.channel.send("No, I am low to the ground.");
          } else if (command == 'bye') {
            message.channel.send("Farewell.");
          } else if (command == 'Status') {
            message.channel.send("I fare well.");
          } else if (command == 'dnd time') {
            message.channel.send("I am oft unawares.");
          } else if (command == 'wake') {
            message.channel.send("Why do you rouse me?");
          } else if (command == 'intro') {
            message.channel.send("I am a nymph named Aria. I help adventurers in their quest to be immersed in their work.");
          }
      

    if (!command) return;

    
    
});

client.login(token);

编辑:我相信错误来自这行特定的代码,这就是发生的错误。

const video = await videoFinder(args.join(' '));
        if(video){
            const stream = ytdl(video.url, {filter: 'audioonly'});
           player.play ( stream, { seek: 0, volume: .5 })
          ;
          connection.subscribe(player);
         await message.reply(`:thumbsup: Now Playing ***${video.title}***`)
        } else {
         message.channel.send(`No video results found`);

“TypeError:无法读取未定义的属性(读取'一次') 在 AudioPlayer.play (C:\Users\"我的用户名"\Documents\DungeonNymph\node_modules@discordjs\voice\dist\audio\AudioPlayer.js:221:29) 在 Object.execute (C:\Users\"我的用户名"\Documents\DungeonNymph\Commands\play.js:38:19) 在 processTicksAndRejections (node:internal/process/task_queues:96:5)"

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow!您能否请edit您的问题并包含有关错误发生位置的错误/详细信息的堆栈跟踪?如果错误直接发生在您发布的代码中,则唯一的位置是client.once('ready', () => {,它不应该抛出该错误,因为client 已经用const client = new Client(...) 定义。
  • 谢谢!感谢格式化方面的帮助,我添加了堆栈跟踪以帮助找到代码的这个损坏部分。

标签: javascript node.js discord discord.js


【解决方案1】:

问题在于AudioPlayer#play 接受AudioResource,而不是流。

使用createAudioResource 使用 ytdl 流创建音频资源:

const stream = ytdl(video.url, { filter: 'audioonly' });
const resource = createAudioResource(stream, { inlineVolume: true });
resource.volume.setVolume(0.5);
player.play(resource);

如果inlineVolume 设置为true(默认false),resource.volume 将是prism-media VolumeTransformer,您可以使用它来设置流的音量。

createAudioResource 选项的文档和选项未显示在文档网站 (#211) 上,但您可以在源代码中找到相关文档 cmets:

我建议查看@discordjs/voice 存储库中的music bot example,了解如何使用该库。

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    相关资源
    最近更新 更多