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

Discord.js结合Canvas导入图片触发SyntaxError无效令牌报错问题咨询

报错核心原因

你遇到的 SyntaxError: Invalid or unexpected token 并非 Canvas 或 Discord.js 的问题,本质是 Node.js 原生模块加载机制的特性导致:

  • Node.js 默认通过 require() 加载资源时,只会正常解析 JavaScript、JSON 格式的文件,没有内置的二进制图片资源解析逻辑。很多从前端开发转Node.js Bot开发的同学,会习惯性沿用前端打包工具里 require 静态资源的写法,但这种写法在原生 Node.js 环境下完全不适用。
  • 你当前用 require('@img') 引入的是 PNG 二进制格式的图片,加载过程中 Node 会直接把图片的二进制文件头(也就是报错里出现的 �PNG)当作 JavaScript 源码执行,自然会抛出语法异常。
  • 哪怕你正确配置了模块别名,只要别名指向的是二进制图片文件,这种 require 写法本身就不成立。
修复步骤
  • 废弃用 require() 加载图片的写法
    Canvas 模块的 loadImage() 方法本身支持直接传入图片的磁盘绝对路径,完全不需要提前 require 图片资源。
  • 修正图片路径获取逻辑
    引入 Node.js 内置的 path 模块,拼接出 licenseTemp.png 的完整绝对路径:
    // 新增内置模块引入
    const path = require('path');
    // 移除原来的错误引入:const licenseTemp = require('@img');
    // 按项目目录结构拼接图片绝对路径,比如你的命令文件在 src/commands/ 下,图片在 src/img/ 下
    const licenseTempImgPath = path.join(__dirname, '../img/licenseTemp.png');
    
  • 调整 Canvas 加载参数
    把传入 loadImage 的内容从 require 出来的乱码替换为上面拼接好的绝对路径:
    // 替换原来的 await Canvas.loadImage(licenseTemp)
    const background = await Canvas.loadImage(licenseTempImgPath);
    
额外校验项
  • 确认模块别名配置的真实指向:如果你配置的 @img 别名是目录映射(比如指向 ./src/img/),之前的 require('@img') 实际会尝试加载目录下的 index.js 模块,根本找不到目标图片,属于路径本身的逻辑错误
  • 检查 OneDrive 同步权限:当前项目存放在 OneDrive 同步目录下,同步占位文件可能会导致资源读取为空,建议把项目移出 OneDrive 同步文件夹,避免线上部署时的路径异常
  • 注意路径大小写匹配:本地 Windows 环境不校验路径大小写,但项目部署到 Linux 服务器时,大小写不匹配会直接导致图片加载失败

内容的提问来源于stack exchange,提问作者chai_turtlep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 04:54:05