我正在尝试使用Node.js使用.json
附加fs
文件。
我在文档顶部写了const fs = require("fs");
,但是在switch
和case
块中,其中大部分代码正常运行,整个fs.readFile(...)
部分似乎没有任何作用。
另外,为简单起见,假设我已经将initCommand
定义为process.argv[2]
,并且将whatToSet
定义为process.argv[3]
这是所讨论的switch
的整个case
和case
块:
switch(initCommand) {
case("set"):
newObject = {
whatToSet: whatToSet,
whenToSet: Date.now(),
};
console.log(newObject);
console.log("top of fs code block");
fs.readFile('objects.json', function (err, data) {
let json = [];
if (!err) {
try {
json = JSON.parse(data);
} catch (e) {
console.error(e);
}
}
json.push(newObject);
fs.writeFile("objects.json", JSON.stringify(json), function(err){
if (err) throw err;
console.log(`Your "object" was successfully appended!`);
});
});
console.log("bottom of fs code block");
break;
}
当我从命令行运行命令时,调用“ set”
case
,这是node index.js set attribute
的输出:{ whatToSet: 'attribute', whenToSet: 1516730036191 }
top of fs code block
bottom of fs code block
不用说,
objects.json
保持不变。任何想法,将不胜感激。编辑:找到了正在取消异步
process.exit();
进程的流氓fs
。代码现在可以正确运行。我还根据每个人的建议对上述fs.readFile(...)...
进行了更新。 最佳答案
确保文件objects.json
存在,它包含有效的JSON,并且JSON表示一个数组(如[]
)。如果文件包含对象({}
),则对.push
的调用将失败。
如果您不关心在发生错误的情况下丢失某些数据的可能性,则可以尝试以下操作:
newObject = {
whatToSet: whatToSet,
whenToSet: Date.now(),
};
console.log(newObject);
console.log("top of fs code block");
fs.readFile('objects.json', function (err, data) {
let json = [];
if (!err) {
try {
json = JSON.parse(data);
} catch (e) {
console.error(e);
}
}
json.push(newObject);
fs.writeFile("objects.json", JSON.stringify(json), function(err){
if (err) throw err;
console.log(`Your "object" was successfully appended!`);
});
});
console.log("bottom of fs code block");
我在Node v8.4.0上测试了此代码,效果很好。