从node.js shell和文件运行时,Javascript代码输出不同

从node.js shell和文件运行时,Javascript代码输出不同,javascript,node.js,Javascript,Node.js,我有node.js这种奇怪的行为。基本上,我想补充的是,这个标题说明了这一切,这和以前的情况不同,代码完全相同。 我怀疑这是在我运行sudo chown-R$USER/usr/local/lib/node_modules之后开始的,因为我想安装typescript并获得写入权限错误,但是我不能100%确定。有趣的是,我的测试通过了,最终一切正常,结果正确,但我不知道为什么我的console.log()输出不同。当我将代码放入节点shell和console.log中时得到的是一个递归调用的串联字符

我有node.js这种奇怪的行为。基本上,我想补充的是,这个标题说明了这一切,这和以前的情况不同,代码完全相同。 我怀疑这是在我运行
sudo chown-R$USER/usr/local/lib/node_modules
之后开始的,因为我想安装typescript并获得写入权限错误,但是我不能100%确定。有趣的是,我的测试通过了,最终一切正常,结果正确,但我不知道为什么我的
console.log()
输出不同。当我将代码放入节点shell和
console.log
中时得到的是一个递归调用的串联字符串。当我从文件中运行代码时,我只从第一次调用中获取字符串。 这是我的密码:

const字段={
0:“D:0:0:0:1:20:9”,
1:“D:1:0:22:1:95:9”,
2:“D:2:0:117:1:27:9”
};
函数getRequiredFields(key,trailing=false){
//钥匙是一个数字
if(尾随类型!=“布尔”){
抛出新错误(“必须是“boolean”类型。默认值为false”);
}
如果(键的类型==“数字”&&&!字段[键]){
抛出新错误(“未定义字段:必须在[0,9]范围内”);
}
if(键的类型!=“编号”){
抛出新错误(“必须是数字”);
}
const lastByte=尾随?\r“:”;
如果(键===0){
返回字段[键]+最后一个字节;
}否则{
返回getRequiredFields(key-1)+“\r”+字段[key]+lastByte;
}
};
log(getRequiredKeys(2,true));
这是我的测试(摩卡+柴):

descripe(“需要一个正数来构建必填字段,可选的第2个参数会在后面加一个回车符,如果为true,则默认为false)”,()=>{
它(“返回必填字段的组合字符串”,()=>{
expect(getRequiredFields(2)).to.be.a(“字符串”);
expect(getRequiredFields(2,true)).to.equal(“D:0:0:0:1:20:9\rD:1:0:22:1:95:9\rD:2:0:117:1:27:9\r”);
expect(getRequiredFields(2,false)).to.equal(“D:0:0:0:1:20:9\rD:1:0:22:1:95:9\rD:2:0:117:1:27:9”);
});
它(“如果不是布尔值,则抛出错误”,()=>{
expect(getRequiredFields.bind(this,10,“foo”).to.throw(“必须是'boolean'类型”);
});
它(“如果大于9则抛出错误”,()=>{
expect(getRequiredFields.bind(this,10,true)).to.throw(“未定义字段:必须在范围[0,9]内”);
});
它(“如果为NaN则抛出错误”,()=>{
expect(getRequiredFields.bind(这是“f”,false)).to.throw(“必须是一个数字”);
});
});

原因是控制字符
\r
(回车),它将光标移动到最左边的点,因此更多的字符将覆盖现有的字符。由于这只影响输出,
字符串
的实际内容不受影响,所以一切都应该正常

如果您打算使用换行符,则应改用
\n
(或
require('os')。EOL
用于特定于操作系统的操作系统)


您还可以尝试以下操作,根据环境的不同,输出
789456
123456789


console.log('123456\r789')
如何从文件中运行代码?我的意思是在终端窗口中键入
node myFile.js
时,而不是在节点shell(或浏览器控制台)中键入并运行代码时。代码中没有
console.log
。请包括完整的代码。见附录,eddited。