Синтаксическая ошибка: ожидание допустимо только в асинхронной функции discord.js

#javascript

#javascript

Вопрос:

Я пытаюсь создать команду для извлечения данных из API для отображения на изображении, но я продолжаю получать эту ошибку:

     /media/bobby/Hardrive/NEW PC/Public/commands/now.js:16
            const background = await Canvas.loadImage('https://lgbtqlounge.xyz/assets/img/canvas.png')
                               ^^^^^
SyntaxError: await is only valid in async function
    at wrapSafe (internal/modules/cjs/loader.js:931:16)
    at Module._compile (internal/modules/cjs/loader.js:979:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10)
    at Module.load (internal/modules/cjs/loader.js:879:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Module.require (internal/modules/cjs/loader.js:903:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/media/bobby/Hardrive/NEW PC/Public/index.js:14:21)
    at Module._compile (internal/modules/cjs/loader.js:1015:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10)
    at Module.load (internal/modules/cjs/loader.js:879:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47
  

Это мой код:

 const fetch = require("node-fetch")
const Canvas = require("canvas")

module.exports = {
    name: 'now',
    description: 'Tells you what is live on LGBTQLounge Radio!',
    async execute(message, args) {
        fetch("http://api.lgbtqlounge.xyz/radio").then(res => res.json()).then(res => {
            const title = res.song.song
            const artist = res.song.artist
            const art = res.song.art
            const currentDJ = res.currentdj.name

            const canvas = Canvas.createCanvas(1250, 500)
            const ctx = canvas.getContext('2d')
            const background = await Canvas.loadImage('https://lgbtqlounge.xyz/assets/img/canvas.png')
            ctx.drawImage(background, 0, 0, canvas.width, canvas.height)
            ctx.strokeStyle = '#74037b'
            ctx.strokeRect(0,0, canvas.width, canvas.height)
            ctx.font = 'bold 48px "Noto Sans", sans-serif'
            ctx.fillStyle = '#ffffff'
            ctx.fillText(`${title} by ${artist}`, canvas.width / 2.5, canvas.height / 2.6)
            ctx.font = 'bold 72px "Noto Sans", sans-serif'
            ctx.fillStyle = '#ffffff'
            ctx.fillText(currentDJ, canvas.width / 2.5, canvas.height / 1.6)
            ctx.beginPath()
            ctx.arc(235, 244, 150, 0, Math.PI * 2, true)
            ctx.closePath()
            ctx.clip()
            ctx.drawImage(art, 85, 95, 300, 300)
            const attachment = new Discord.MessageAttachment(canvas.toBuffer(), 'now.png')
          
            message.channel.send(attachment);
        })
    }
}
  

Если кто-нибудь может помочь мне с этой проблемой, это будет с радостью оценено!

Заранее спасибо за любую помощь, и я надеюсь, что у всех отличный день (это не позволяет мне публиковать, потому что большая часть этого кода, поэтому нужно немного доработать, чтобы я получал самое интересное в своей жизни)

Комментарии:

1. Вам не хватает такой функции async function execute(message, args) .

Ответ №1:

Как указано в ошибке, await допустимо только в async функции, вам нужно обернуть свой код в async функцию. Ваша execute функция async , но прямая родительская функция const background = await Canvas.loadImage не является асинхронной, которая является обратным .then вызовом .

 fetch("http://api.lgbtqlounge.xyz/radio").then(res => res.json())
     .then(async res => {
            const title = res.song.song
            const artist = res.song.artist
            const art = res.song.art
            const currentDJ = res.currentdj.name

            const canvas = Canvas.createCanvas(1250, 500)
            const ctx = canvas.getContext('2d')
            const background = await Canvas.loadImage('https://lgbtqlounge.xyz/assets/img/canvas.png')
            ctx.drawImage(background, 0, 0, canvas.width, canvas.height)
            ctx.strokeStyle = '#74037b'
            ctx.strokeRect(0,0, canvas.width, canvas.height)
            ctx.font = 'bold 48px "Noto Sans", sans-serif'
            ctx.fillStyle = '#ffffff'
            ctx.fillText(`${title} by ${artist}`, canvas.width / 2.5, canvas.height / 2.6)
            ctx.font = 'bold 72px "Noto Sans", sans-serif'
            ctx.fillStyle = '#ffffff'
            ctx.fillText(currentDJ, canvas.width / 2.5, canvas.height / 1.6)
            ctx.beginPath()
            ctx.arc(235, 244, 150, 0, Math.PI * 2, true)
            ctx.closePath()
            ctx.clip()
            ctx.drawImage(art, 85, 95, 300, 300)
            const attachment = new Discord.MessageAttachment(canvas.toBuffer(), 'now.png')
          
            message.channel.send(attachment);
        })
  

Выполнение функции обратного вызова as async решит вашу проблему.

Ответ №2:

Ошибка здесь довольно ясна: вы можете использовать только await внутри async функции.

Вы используете await here фактически во вложенной функции:

 async execute(message, args) {
    fetch("http://api.lgbtqlounge.xyz/radio").then(res => res.json()).then(res => {
        ...
        const background = await Canvas.loadImage('https://lgbtqlounge.xyz/assets/img/canvas.png')
        ...
    })
}
  

await Находится внутри res => { ... } , а не внутри async execute() { ... } .

Самое простое (как в «наименьшей работе») исправление здесь — сделать вложенную функцию async функцией:

 fetch("http://api.lgbtqlounge.xyz/radio")
    .then(res => res.json())
    .then(async res => { ... })
  

Однако вы фактически смешиваете использование async / await с обычной .then() цепочкой обещаний. Правильным решением было бы переключить всю функцию на использование одного или другого, предпочтительно async / await потому что его легче читать:

 module.exports = {
    name: 'now',
    description: 'Tells you what is live on LGBTQLounge Radio!',
    async execute(message, args) {
        const res = await fetch("http://api.lgbtqlounge.xyz/radio")
        const json = await res.json()
        const title = json.song.song
        const artist = json.song.artist
        const art = json.song.art
        const currentDJ = json.currentdj.name

        const canvas = Canvas.createCanvas(1250, 500)
        const ctx = canvas.getContext('2d')
        const background = await Canvas.loadImage('https://lgbtqlounge.xyz/assets/img/canvas.png')
        ctx.drawImage(background, 0, 0, canvas.width, canvas.height)
        ctx.strokeStyle = '#74037b'
        ctx.strokeRect(0,0, canvas.width, canvas.height)
        ctx.font = 'bold 48px "Noto Sans", sans-serif'
        ctx.fillStyle = '#ffffff'
        ctx.fillText(`${title} by ${artist}`, canvas.width / 2.5, canvas.height / 2.6)
        ctx.font = 'bold 72px "Noto Sans", sans-serif'
        ctx.fillStyle = '#ffffff'
        ctx.fillText(currentDJ, canvas.width / 2.5, canvas.height / 1.6)
        ctx.beginPath()
        ctx.arc(235, 244, 150, 0, Math.PI * 2, true)
        ctx.closePath()
        ctx.clip()
        ctx.drawImage(art, 85, 95, 300, 300)
        const attachment = new Discord.MessageAttachment(canvas.toBuffer(), 'now.png')
          
        message.channel.send(attachment);
    }
}