javascript - 服务器首次启动时创建一次 JSON 文件

标签 javascript json node.js fs

我试图创建一个 json 文件一次(服务器首先加载),这样我以后就可以引用该 json 文件,而不是每次用户请求该页面时都渲染该 JSON。

我有一个有效的 json。我用firefox检查了一下,here ,但是当我尝试使用 node.js 创建一个文件并且之前检查了 JSON 时,我收到错误。

首先,我创建该文件,它可以工作(并且它已被填充,但仅在第一次使用新文件名时,如果我再次使用相同的文件名,该文件将为空...)并且一旦我加载它,这个文件变空了,我得到了这个错误(实际上我不知道它什么时候变空,这是我的问题,我不知道错误在哪里..)。

错误:

module.js:489
    throw err;
          ^
SyntaxError: ...\data\my.json: Unexpected end of input
    at Object.parse (native)
    at Object.Module._extensions..json (module.js:486:27)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object.<anonymous> (...\routes\projects.js:72:14)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)

我正在使用

fs.unlink

fs.writeFile

我不明白这里发生了什么,完全奇怪......

ps.:我使用的是 Express.js

最佳答案

问题是在 createDataOnceWhenServerFirstTimeStarts 中创建文件的代码是异步的。因此,当您尝试加载 JSON 时,它可能还没有被写入。 如果文件已经存在,还会出现另一个问题:fs.unlink 也是异步的,您无需等待此步骤完成即可写入文件。

如果需要在服务器开始监听之前完成此初始化,我建议您仅使用同步 fs 方法:

exports.createDataOnceWhenServerFirstTimeStarts = function () {

var myData = ...;//get data from funciton call
var outputFilename = "data/my.json";

if (fs.existsSync(outputFilename)) {
    try {
        fs.unlinkSync(outputFilename);
        console.log("File deleted successfully!");
    } catch (err) {
        return console.error(err);
    }
} else {
    console.log("File does not exist!");
}

var dataToWrite = JSON.stringify(myData);//,null,4);
try {
    fs.writeFileSync(outputFilename, dataToWrite);
    console.log("JSON saved to " + outputFilename);
} catch (err) {
    return console.log(err);
}
};

顺便说一句,您不一定需要先删除(取消链接)该文件,fs.writeFile 将覆盖它(如果存在)。

关于javascript - 服务器首次启动时创建一次 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772175/

相关文章:

json - 使用 JSON-B 1.0(例如 Yasson、Java EE 8)有效地将 JsonObject 转换为 pojo

javascript - 如何从 Angular JS API 调用 Node.js Web API?

javascript - mapDispatchToProps 中的链接粗箭头让我出错

javascript - 无法在循环和 setInterval 上使用闭包

javascript - 如何使用 Jest 和 Enzyme 测试组件的条件渲染

c# - Json Ajax 参数传递和 Webmethod 未触发

c# - 如何按 OData 中的嵌套属性进行过滤?

javascript - 小JS循环问题

node.js - Nexmo 不在 node.js 中发送短信

node.js - 执行 Mongo 使用 Mongo shell 在文本文件中插入命令