JavaScript字符串比较异常:Discord Bot文本读取逻辑失效
问题排查与修复方案
看起来你的问题大概率是行内容的空白字符干扰或者代码逻辑里的小疏漏导致的,不是JavaScript本身的异常。咱们一步步拆解分析:
核心问题拆解
空白字符破坏匹配逻辑
你把行转成小写后直接用===判断'stacktrace:',但如果文本文件里的Stacktrace:行末尾带有空格、换行符(比如\r残留),转成字符串后就会变成'stacktrace: '或者'stacktrace:\r',自然匹配不上。你说console.log行内容正常,大概率是控制台自动忽略了末尾的空白字符,实际字符串里是存在这些干扰项的。循环未及时终止
当linesToPrint < 1时你调用了liner.close(),但没有终止循环,这会导致liner.next()继续读取后续行(虽然已经close,但n-readlines可能不会立刻返回null),不过这个不是你第二天匹配失败的直接原因,但会造成不必要的资源占用。字符串匹配的冗余写法
用substring(0, 12)判断是否以description:开头不够直观,而且如果行长度不足12会出问题,换成startsWith()更安全清晰。
修复后的代码
function readLatestCrashReport() { const lineByLine = require('n-readlines'); const liner = new lineByLine('tests/crash-report.txt'); let line, linesToPrint = 0, stackTraceFound = false, errors = []; while (line = liner.next()) { // 转小写+去除前后空白(解决换行/空格干扰) line = line.toString('ascii').toLowerCase().trim(); if (line.startsWith('description:')) { errors.push(line); } else if (line === 'stacktrace:') { errors.push(line); linesToPrint = 3; stackTraceFound = true; } else if (linesToPrint > 0 && line !== '') { linesToPrint--; errors.push(line); } else if (stackTraceFound && linesToPrint < 1) { liner.close(); break; // 终止循环,避免无效读取 } } if (errors.length !== 0) { return errors.join('\n'); } else { return 'No Description Or Stacktrace Could Be Found'; } }
额外验证建议
- 你可以在处理行之前加一行
console.log([RAW LINE] "${line.toString('ascii')}");,查看实际读取到的原始字符串,确认是否有空白字符干扰。 - 检查第二天的
crash-report.txt是否有格式变化,比如Stacktrace:行是否被修改(比如加了空格、缩进)。
内容的提问来源于stack exchange,提问作者Jackster
相关产品推荐
相关产品推荐

