首页 > 解决方案 > 更新文件中的内容后读取文件

问题描述

我在 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 方法中以相同的顺序调用这些方法。我在响应中发回了rdatafromExecuteCmd方法的返回值。

我看到每次我rdataExecuteCmd方法调用 API 时都是一样的。我希望上述这些方法同步执行,以便CreateThemeScss仅在UpdateJson完成后执行并且ExecuteCmd必须仅在CreateThemeScss完成后执行,以便我在响应中获得更新rdata

欢迎任何形式的帮助

标签: node.jsnodes

解决方案


首先,您需要Stream NodeJS 文档

我从你的问题中了解到的是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();
...

推荐阅读