You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:18:11