Node.js的forEach输出在Raspbian系统异常但Windows系统运行正常
问题原因
这是换行符跨平台标准不一致导致的问题:
- Windows系统默认文本换行符为
\r\n(CRLF),Linux(含Raspbian)默认文本换行符为\n(LF),你代码里硬编码了\r\n作为拆分和写入的换行符,跨平台运行时就会出现解析异常。 - 你在Raspbian上输出异常的本质是:拆分后每个内容项末尾残留了未被正确处理的
\r回车符,终端输出时\r会将光标移到当前行首,后续console.log自带的换行符就会把内容拆成两行,最终呈现test:单独占一行,内容跑到下一行的异常效果。
修复方案
- 读取文件时统一换行符处理,避免硬编码拆分规则:
将原有读取拆分代码
var data = fs.readFileSync('./txt/wordlist.txt', 'ascii').toString().split("\r\n");
修改为:
// 先把所有CRLF统一替换为LF,再按LF拆分,适配所有平台的换行格式 var data = fs.readFileSync('./txt/wordlist.txt', 'ascii').toString().replace(/\r\n/g, '\n').split("\n");
- 写入文件时使用系统原生换行符,自动适配运行环境:
首先引入Node.js内置os模块:
const os = require('os');
将原有写入代码
fs.appendFileSync('./txt/wordlist.txt',`\r\n${a}`,'ascii');
修改为:
// os.EOL会自动返回当前系统对应的换行符 fs.appendFileSync('./txt/wordlist.txt', `${os.EOL}${a}`, 'ascii');
- 修正无效的非空判断逻辑:
你原有if(filtered!="")的逻辑是错误的,数组与空字符串对比永远返回true,建议替换为:
if (filtered.length > 0)
内容的提问来源于stack exchange,提问作者Aelux
相关产品推荐
相关产品推荐

