升级至Discord.js 14.0.3版本时出现Date.js TypeError错误
解决Discord.js 14.0.3升级后的Date.js TypeError问题
升级Discord.js至14.0.3版本后,出现以下错误:
/home/container/node_modules/datejs/src/core/parser.js:106 ords = s.match(/\b(\d+)(?:st|nd|rd|th)\b/); // find ordinal matches ^ TypeError: s.match is not a function at Object.removeOrds (/home/container/node_modules/datejs/src/core/parser.js:106:13) at Function.parse (/home/container/node_modules/datejs/src/core/parser.js:147:47) at new Activity (/home/container/node_modules/discord.js/src/structures/Presence.js:241:34) at /home/container/node_modules/discord.js/src/structures/Presence.js:89:57 at Array.map (<anonymous>) at Presence._patch (/home/container/node_modules/discord.js/src/structures/Presence.js:89:41) at PresenceManager._add (/home/container/node_modules/discord.js/src/managers/CachedManager.js:36:18) at PresenceManager._add (/home/container/node_modules/discord.js/src/managers/PresenceManager.js:22:18) at PresenceUpdateAction.handle (/home/container/node_modules/discord.js/src/client/actions/PresenceUpdate.js:29:41) at Object.module.exports [as PRESENCE_UPDATE] (/home/container/node_modules/discord.js/src/client/websocket/handlers/PRESENCE_UPDATE.js:4:33) at WebSocketManager.handlePacket (/home/container/node_modules/discord.js/src/client/websocket/WebSocketManager.js:352:31) at WebSocketShard.onPacket (/home/container/node_modules/discord.js/src/client/websocket/WebSocketShard.js:481:22) at WebSocketShard.onMessage (/home/container/node_modules/discord.js/src/client/websocket/WebSocketShard.js:321:10) at WebSocket.onMessage (/home/container/node_modules/discord.js/node_modules/ws/lib/event-target.js:199:18) at WebSocket.emit (node:events:527:28) at Receiver.receiverOnMessage (/home/container/node_modules/discord.js/node_modules/ws/lib/websocket.js:1178:20) Node.js v17.9.1
问题原因
该错误源于Date.js的removeOrds函数中,传入的参数s并非字符串类型,导致调用match方法失败。Discord.js v14在处理用户状态(Presence)中的活动(Activity)时,传递给Date.js的参数类型不符合预期;且Date.js是一个停止维护的老旧库,对现代JS环境的类型兼容性较差。
解决方案
方案一:移除Date.js依赖
如果项目未直接使用Date.js,它大概率是其他依赖的间接依赖,直接卸载即可:
npm uninstall datejs
Discord.js v14本身已内置日期处理能力,无需依赖第三方的Date.js。
方案二:替换为现代日期库
若项目确实需要日期处理功能,建议用活跃维护的现代库(如date-fns或luxon)替代Date.js:
- 安装替代库:
npm install date-fns - 替换项目中Date.js的调用,例如:
// 原Date.js代码 Date.parse('2024-05-20') // 替换为date-fns import { parseISO } from 'date-fns' parseISO('2024-05-20')
方案三:临时修改Date.js代码(不推荐)
若暂时无法替换或移除Date.js,可临时修改其源码添加类型检查:
打开node_modules/datejs/src/core/parser.js,修改removeOrds函数:
function removeOrds(s) { // 新增类型检查,确保参数为字符串 if (typeof s !== 'string') return s; ords = s.match(/\b(\d+)(?:st|nd|rd|th)\b/); // find ordinal matches // 原函数剩余代码保持不变 }
注意:此修改会在依赖更新后失效,仅作为应急临时方案。
内容的提问来源于stack exchange,提问作者Toffi
相关产品推荐
相关产品推荐

