创建了一个json文件,其中包含漂亮的打印文件
load: function () {
var chart = this;
$('#container').on('mousemove', function () {
var point = chart.hoverPoints && chart.hoverPoints[0];
$('#btn').html(point ? point.close : 'shows close value');
});
}
}
我可以用那个
读取文件[
{
"name": "c",
"content": 3,
"_prototype": "item"
},
{
"name": "d",
"content": 4,
"_prototype": "item"
}
]
但输出顺序相反
var fs = require('fs');
var arrayPath = './array.json';
function fsReadFileSynchToArray (filePath) {
var data = JSON.parse(fs.readFileSync(filePath));
console.log(data);
return data;
}
var test = arr.loadFile(arrayPath);
console.log(test);
显然第二个输出显示为第一个。我实际上使用了同步文件读取来避免这种空数据。有没有办法真正确保JSON文件在继续之前完全读入数组?
[更新] arr是一个使用
的模块[]
[ { name: 'c', content: 3, _prototype: 'item' },
{ name: 'd', content: 4, _prototype: 'item' },]
返回值
答案 0 :(得分:15)
只要文件位于项目文件夹(配置文件,即)中,您就可以直接在NodeJS中同步加载它。
var test = require('./array.json');
然后在下一个执行的句子中将内容加载到您的变量中。
你可以尝试console.log它,它会打印出来:
[ { name: 'c', content: '3', _prototype: 'item' },
{ name: 'd', content: '4', _prototype: 'item' } ]
完全按照文件的顺序排列。
答案 1 :(得分:3)
fs.stat
是异步的,所以你的函数是异步的。
您想要fs.fstatSync
。
答案 2 :(得分:1)
不建议在加载前测试文件是否存在,这也是不推荐使用fs.exists
的原因:
在调用
fs.exists()
之前,使用fs.open()
检查文件是否存在,不建议使用fs.readFile()
或fs.writeFile()
。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应直接打开/读取/写入文件,并在文件不存在时处理引发的错误。
您使用fs.stats
的方式仅相当于已弃用的fs.exists
。
因此,您应该始终认为文件在阅读时不会退出。
对于同步通话,您应该写:
var data;
try {
data = JSON.parse(fs.readFileSync(filePath));
} catch ( err ) {
// handle your file not found (or other error) here
}
或
var data;
try {
data = require('./array.json');
} catch ( err ) {
// handle your file not found (or other error) here
}
如果以异步方式执行此操作,请检查回调函数的错误参数,以便在文件不存在时处理该情况:
fs.readFile(filePath, (err, fileContent) => {
var data;
if( err ) {
// handle your file not found (or other error) here
} else {
data = JSON.parse(fileContent);
}
})
答案 3 :(得分:0)
const fs=require('fs');
var obj = JSON.parse(fs.readFileSync('file.json', 'utf8'));
console.log(obj);