Discord机器人开发报错:UnhandledPromiseRejectionWarning 无法读取null的split属性
报错原因&修复方案
你遇到的UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'split' of null报错核心由以下问题导致:
- 低级语法错误:你声明存储收集结果的变量时写的是
let results = {},这是对象类型,没有push方法,你往里面塞用户回复的操作完全失效,results[2]自然为undefined,和null的判断不生效,后续调用split方法就直接报错。 - 校验逻辑缺失:你只判断了
results[2] !== null,没有覆盖undefined、空字符串、输入内容不含:的场景,就算数组声明正确,用户输入不符合要求时也会触发同类报错。
另外还有几个需要同步修复的隐藏问题:
- 代码中用到的
res变量没有提前声明,属于隐式全局变量,会引发不可预估的运行异常。 - 错误回调里把
message拼写为mesage,报错触发时会抛出新的未捕获异常。 - 保存数据时给
new data()传第二个upsert参数是无效的,upsert是更新操作的配置项,新建文档不需要传该参数。
核心修复代码片段
只需要替换collector.on('end')部分的代码即可:
collector.on('end', async (collected) => { // 把对象声明改为数组声明 let results = []; collected.forEach((value) => { results.push(value.content); console.log(value.content) }); let res2; // 补充完整的前置校验 if (results.length >=3 && typeof results[2] === 'string' && results[2].includes(':')) { res2 = results[2].split(':'); } else { return message.reply('请输入符合格式的提醒时间,格式为HH:MM'); } // 补充拆分结果校验 if (!res2 || res2.length < 2) { return message.reply('时间格式错误,请重新运行注册命令'); } // 此处保留你原来的后续逻辑不变 console.log('results[0].length : ' + results[0].length); console.log('results[1].length : ' + results[1].length); console.log('res2[0].length : ' + res2[0].length); console.log('res2[1].length : ' + res2[1].length); // 原有校验、入库逻辑不变... })
内容的提问来源于stack exchange,提问作者AFellowFriendlyMemer
相关产品推荐
相关产品推荐

