Node.js脚本似乎跳过了fs.readFile代码块

时间:2018-01-23 18:13:24

标签: javascript node.js command-line switch-statement

我正在尝试使用Node.js使用.json附加fs文件。

我在我的文档顶部写了const fs = require("fs");,但在switchcase块中,大部分代码都正常运行,整个fs.readFile(...)部分似乎没有做任何事情。

另外,为了简单起见,我们将initCommand定义为process.argv[2],将whatToSet定义为process.argv[3]

此处是switch的整个casecase块:

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”casenode 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(...)...位。

1 个答案:

答案 0 :(得分:1)

确保文件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上测试了这段代码,它运行得很好。