为什么“ fs”仅在程序结束后保留​​文件更改?

时间:2019-03-30 21:47:42

标签: javascript node.js fs

我有一个应用程序,该应用程序将其状态保留在磁盘上,当发生任何状态更改时,它将从文件中读取旧状态,然后更改内存中的状态并再次保留在磁盘上。但是,问题在于存储功能仅在关闭程序后才在磁盘上写入。我不知道为什么?

const load = (filePath) => {
    const fileBuffer = fs.readFileSync(
        filePath, "utf8"
    );
    return JSON.parse(fileBuffer);
}

const store = (filePath, data) => {

    const contentString = JSON.stringify(data);
    fs.writeFileSync(filePath, contentString);
}

要创建一个完整的示例,我们在文件“ src / interpreter / index.js”中使用load-dataset命令。

while(this.isRunning) {

    readLineSync.promptCL({
      "load-dataset": async (type, name, from) => {
          await loadDataset({type, name, from});
      },
      ...
    }, {
      limit: null,
    });
}

通常,这将调用loadDatasets,该文件将读取jsoncsv个文件。

export const loadDataset = async (options) => {

  switch(options.type) {
    case "csv":
      await readCSVFile(options.from)      
      .then(data => {
        app.createDataset(options.name, data);
      });
      break;
    case "json":
      const data = readJSONFile(options.from);
      app.createDataset(options.name, data);
      break;
  }
}

方法createDataset()读取磁盘上的文件,对其进行更新并再次写入。

createDataset(name, data) {
    const state = loadState();
    state.datasets = [
      ...state.datasets,
      {name, size: data.length}
    ];
    storeState(state);

    const file = loadDataset();
    file.datasets = [
      ...file.datasets,
      {name, data}
    ];
    storeDataset(file);
  }

方法loadState(), storeState(), loadDataset(), storeDataset()使用初始方法的地方。

const loadState = () => 
  load(stateFilePath);
const storeState = state => 
  store(stateFilePath, state);
...
const loadDataset = () =>
  load(datasetFilePath);
const storeDataset = dataset => 
  store(datasetFilePath, dataset);

我正在使用来自npm的名为readline-sync的软件包创建一个简单的“终端”,我不知道它是否会引起一些冲突。

源代码位于Github中:Git repo。在文件“ index.js”中,方法createDataset()调用loadState()storeState(),它们都使用上面显示的方法。

在解释器(此处为Interpreter file)中使用了软件包readline-sync,该软件包基本循环直到退出命令为止。

请注意,我正在使用Ubuntu 18.04.2和Node.js 10.15.0。为了编写此代码,我在YouTube Video中看到了一个示例。这个家伙正在使用MAC OS X,我真的希望系统不会出现问题。

0 个答案:

没有答案