#javascript #node.js #discord.js #bots
Вопрос:
Итак, у меня есть этот код:
client.on("messageCreate", async (msg) => {
if (msg.content.startsWith("-p")) {
if (!msg.member.voice?.channel) return msg.channel.send("Por favor...");
const connection = joinVoiceChannel({
channelId: msg.member.voice.channel.id,
guildId: msg.guild.id,
adapterCreator: msg.guild.voiceAdapterCreator,
});
google
.youtube("v3")
.search.list({
key: process.env.YOUTUBE_TOKEN,
part: "id",
q: msg.content.slice(3),
maxResults: 1,
})
.then((response) => {
const { data } = response;
let link = "https://www.youtube.com/watch?v=" data.items.id.videoId;
});
let args = msg.content.slice(3);
let stream = await play.stream(args);
let resource = createAudioResource(stream.stream, {
inputType: stream.type,
});
let player = createAudioPlayer({
behaviors: {
noSubscriber: NoSubscriberBehavior.Play,
},
});
player.play(resource);
connection.subscribe(player);
}
});
И я хотел бы использовать значение переменной «link», которая является строкой, в качестве параметра для метода play.stre(args)
Я не совсем понимаю, как это сделать
Кроме того, если возможно, я хотел бы найти способ сохранить это значение также внутри массива за пределами всего:
*client.on('messageCreate' , async msg => {... ...})*
Ответ №1:
Вы, скорее всего, захотите позвонить play.stream
из then
обратного вызова list
:
google.youtube("v3")
.search.list({
key: process.env.YOUTUBE_TOKEN,
part: "id",
q: msg.content.slice(3),
maxResults: 1,
})
.then(async (response) => {
const { data } = response;
let link = "https://www.youtube.com/watch?v=" data.items.id.videoId;
let stream = await play.stream(link);
});
Таким образом, вы убедитесь, что у вас действительно задано значение link
при использовании его для вызова stream
.
Комментарии:
1. Делая это, я получаю еще одну ошибку «Синтаксическая ошибка: ожидание допустимо только в асинхронных функциях и телах модулей верхнего уровня».
2. Это просто потому
then
, что обратный вызов не был асинхронным. Я добавилasync
ключевое слово сейчас, но это просто быстрое решение. Я бы рекомендовал провести рефакторинг в использованииasync/await
в целом, это позволит вам многое очистить.3. @CristianDavidMoraleda Я бы также предложил уделить минуту, чтобы почитать об асинхронности/ожидании . Это может сбивать с толку, но важно, чтобы вы полностью это понимали, иначе вам будет очень больно пытаться это сделать
4. После помещения «play.stream» в тогдашний обратный вызов списка метод createAudioResource() теперь говорит, что переменная «поток» не определена
5. Вам нужно будет адаптировать остальную часть вашего кода. Я не пытаюсь переработать ваш код для вас, но чтобы дать вам представление о концепции.