Discord.js开发时出现TypeError: 无法读取undefined的startsWith属性
Discord机器人命令模块
TypeError: Cannot read property 'startsWith' of undefined问题排查 报错产生原因
- 对象属性名不匹配:Discord.js 传入的
message实例中,存储消息文本的属性为全小写的content,代码解构时误写为大写的CONTENT,最终得到的解构值为undefined,对undefined调用startsWith方法时会直接触发该类型错误。 - 模板字符串语法缺失:代码中两处使用
${}变量占位符的位置,未按JS模板字符串规则在外层包裹反引号,属于语法层面的遗漏,即使修正了属性取值问题,这段代码也无法正常解析运行。 - 边界场景未过滤:当前逻辑没有提前过滤机器人自身发送的消息、加载状态下的不完整消息实例,偶发场景下也会拿到空的消息内容,触发同类报错。
修复操作
按以下几点调整代码即可解决问题:
- 将解构得到的大写
CONTENT改为小写content,匹配Discord.js的对象属性命名规则 - 为需要拼接变量的模板字符串补充对应反引号,保证语法合法
- 增加前置判断逻辑,遇到空消息内容、机器人发送的消息直接跳过后续处理,减少无效执行
调整后的可正常运行代码参考:
const { PREFIX } = require("../config.json"); module.exports = (client, aliases, callBack) => { if (typeof aliases === "string") { aliases = [aliases]; } client.on("message", message => { // 跳过机器人消息、空内容消息 if (message.author.bot || !message.content) return; const { content } = message; aliases.forEach(alias => { const COMMAND = `${PREFIX}${alias}`; if (content.startsWith(`${COMMAND}`) || content === COMMAND) { console.log(`Asuna is running the command "${COMMAND}"...`); callBack(message); } }); }); }
版本兼容提示:如果使用Discord.js v14及以上版本,需将原
message事件替换为messageCreate事件,旧版message事件在新版本中已被弃用,会导致命令逻辑完全无法触发。
内容的提问来源于stack exchange,提问作者CRYPTY
相关产品推荐
相关产品推荐

