Discord.js 获取Canvas附件URL问题求助
解决Discord.js中Canvas生成附件的url返回undefined的问题
嘿,我懂你碰到的麻烦了——你用Canvas生成了图片附件,想获取它的URL发送到Discord频道,但attachment.url一直返回undefined对吧?咱们来拆解下问题,然后搞定它。
问题根源
你现在的代码里,刚创建Discord.MessageAttachment就直接去拿它的url属性,但这时候附件还没有被上传到Discord的服务器,自然不会有分配好的URL。只有当附件成功发送到频道,Discord返回了包含附件信息的消息对象后,你才能拿到有效的URL。
修改后的代码
咱们调整下代码逻辑,先发送附件,再从返回的消息里提取URL:
client.on('message', async message => { if (message.author.bot || message.channel.type === 'dm') return; if (message.content.toLowerCase().indexOf(prefix.toLowerCase()) !== 0) return; var args = message.content.slice(prefix.length).trim().split(/ +/g); var command = args.shift().toLowerCase(); if(command === 'image'){ let text = message.content.split(" ").slice(1).join(' '); // 变量名更清晰,避免重复args const canvas = Canvas.createCanvas(400, 140); const ctx = canvas.getContext('2d'); ctx.fillStyle = '#ffffff'; ctx.font = '150px serif'; ctx.shadowColor = 'black'; ctx.shadowBlur = 5; ctx.fillText(text, 0, 118); ctx.strokeStyle = '#000000'; ctx.strokeText(text, -1, 118); ctx.textAlign = "center"; const attachment = new Discord.MessageAttachment(canvas.toBuffer(), 'image.png'); // 发送消息并接收返回的消息对象 const sentMessage = await message.channel.send({ content: '生成的图片:', files: [attachment] }); // 从返回的消息里获取第一个附件的URL const attachmentUrl = sentMessage.attachments.first()?.url; // 打印或使用这个URL message.channel.send(`图片的URL:\`${attachmentUrl}\``); } });
关键修改点
- 用
await message.channel.send(...)接收发送后的消息对象sentMessage,这样就能拿到Discord返回的附件信息 - 通过
sentMessage.attachments.first()?.url获取第一个附件的URL(这里用了可选链操作符?.,避免如果没有附件时报错) - 把原来重复的
args变量改成text,让代码更易读
这样调整后,你就能正确获取到Canvas生成图片的Discord URL啦!
内容的提问来源于stack exchange,提问作者Sarite
相关产品推荐
相关产品推荐

