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
相关产品推荐
相关产品推荐

