Прочитать файл после обновления содержимого в файле - PullRequest
0 голосов
/ 11 марта 2019

Я создал три метода, как показано ниже в узле 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.

Я вижу, что каждый раз, когда я вызываю API rdata из метода ExecuteCmd, то же самое.Я хочу, чтобы указанные выше методы выполнялись синхронно, чтобы CreateThemeScss выполнялся только после завершения UpdateJson, а ExecuteCmd должен выполняться только после завершения CreateThemeScss, чтобы я получил обновленный rdata в своем ответе.

Любая помощь приветствуется

1 Ответ

0 голосов
/ 11 марта 2019

Во-первых, вам нужна документация 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();
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...