#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);
}
}