Discord旧机器人!rank命令报错:Missing discriminator及字体警告
问题描述
恢复旧Discord机器人后,启动正常,但执行生成用户卡片的!rank命令时报错,当初开发时无此问题,报错信息如下:
(process:6848): Pango-WARNING **: 18:49:10.209: 无法加载字体 "Manrope Bold Not-Rotated 36px",将 fallback 到 "Sans Bold Not-Rotated 36px",输出效果可能很丑。
(node:6848) UnhandledPromiseRejectionWarning: Error: Missing discriminator!
在 Rank.build (D:\Новая папка (4)\discord_bot\node_modules\canvacord\src\Rank.js:511:53)
在 processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:6)Orange
Author water手动)在 [ Prepare:未处理的Promise拒绝。该错误要么是因为在没有catch块的async函数中抛出异常,要么是因为拒绝了一个未用.catch()处理的Promise。
要在未处理的Promise拒绝时终止Node.js进程,请使用CLI标志--unhandled-rejections=strict。(拒绝ID: 1)
(node:6848) [DEP0018] DeprecationWarning: 未处理的Promise拒绝已被弃用。未来,未处理的Promise拒绝将导致Node.js进程以非零退出码终止。
核心错误与修复
1. Missing discriminator! 错误
这是Canvacord库构建Rank卡片时,找不到用户的鉴别器(即用户名后#开头的四位数字)导致的,原因及解决:
- 版本不兼容:新版Discord.js已移除
discriminator字段(适配Discord无鉴别器用户名系统),但旧版Canvacord仍依赖该字段。升级Canvacord到最新版:npm install canvacord@latest - 代码兼容处理:如果升级后仍报错,手动给Rank实例传入鉴别器(兼容新旧用户系统):
const rank = new canvacord.Rank() .setUser(user) .setDiscriminator(user.discriminator ?? '') // 无鉴别器时用空字符串替代 // 其他卡片配置...
2. 字体加载警告
系统未安装Manrope字体导致,两种解决方式:
- 下载安装Manrope字体到本地系统;
- 替换为系统自带字体,比如:
const rank = new canvacord.Rank() .setFont('Sans') // 用系统默认Sans字体替代 // 其他卡片配置...
3. 未处理的Promise拒绝
给rank.build()添加错误捕获,避免进程崩溃:
rank.build() .then(data => { // 发送生成好的卡片逻辑 }) .catch(err => { console.error('生成Rank卡片失败:', err); // 给用户发送错误提示消息 });
内容的提问来源于stack exchange,提问作者Fufulupa

