更新文件中的内容后读取文件

时间:2019-03-11 19:08:53

标签: node.js nodes

我在Node JS中创建了以下三种方法

function UpdateJson(reqData){
  let rawdata = fs.readFileSync('someData.json'); 
  let data = JSON.parse(rawdata);

  Object.keys(data).forEach(function(key) {
    data[key] = reqData[key];
  });

 fs.truncateSync('someData.json', 0, function(){});
     let jstrData = JSON.stringify(data);
     fs.writeFileSync('someData.json', jstrData, function(){});
 }

function CreateThemeScss(jFile){
    fs.createReadStream(jFile)
    .pipe(jsonSass({
      prefix: '$theme: ',
    }))
    .pipe(fs.createWriteStream('sData.scss'));
}

function ExecuteCmd(){
  exec('node-sass sData.scss styles.css');
  var rdata = fs.readFileSync('styles.css').toString();
  return rdata;
}

我正在按相同的顺序在app.post方法中调用这些方法。 我正在从响应中的rdata方法返回的ExecuteCmd中发回邮件。

我看到每次从rdata方法调用API ExecuteCmd时都是相同的。我希望上述方法同步执行,以便CreateThemeScss仅在UpdateJson完成后执行,ExecuteCmd必须仅在CreateThemeScss完成后执行,这样我才能获得更新的{ {1}}。

欢迎任何帮助

1 个答案:

答案 0 :(得分:0)

首先,您需要Stream NodeJS documentation

我从您的问题中了解到,CreateThemeScss函数调用保持异步,因为jsonSass给您一个stream对象。

但是您似乎想在执行CreateThemeScss之前等待ExecuteCmd流的结束。

如果出现问题,这就是我们可以采取的方法:

function UpdateJson(reqData) {
    const rawdata = fs.readFileSync('someData.json'); 
    let data = JSON.parse(rawdata);

    Object.keys(data).forEach(function(key) {
        data[key] = reqData[key];
    });

    // fs.truncateSync('someData.json', 0, function(){});
    // is wrong called, see https://nodejs.org/dist/latest-v8.x/docs/api/fs.html#fs_fs_ftruncatesync_fd_len

    fs.truncateSync('someData.json', 0);
    const jstrData = JSON.stringify(data);

    // fs.writeFileSync('someData.json', jstrData, function(){});
    // is wrong called, see https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options

    fs.writeFileSync('someData.json', jstrData);
}

function CreateThemeScss(jFile) {
    return new Promise((resolve, reject) => {
        const readStream = fs.createReadStream(jFile);

        readStream.on('error', reject);

        readStream.on('end', resolve);

        readStream
            .pipe(jsonSass({
                prefix: '$theme: ',
            }))
            .pipe(fs.createWriteStream('sData.scss'));
    }
}

function ExecuteCmd() {
    exec('node-sass sData.scss styles.css');
    // return rdata
    return fs.readFileSync('styles.css').toString();
}

并这样称呼:

...
UpdateJson("{'test':'test'}");
await CreateTheme(dJson.json);
var a = ExecuteCmd();
...