Как заставить JavaScript-сервер Node.js ждать завершения моего bash-скрипта, прежде чем делать что-либо еще - PullRequest
0 голосов
/ 05 июля 2019

Через код Node.js я запускаю 3 команды bash. Часть файла показана ниже:

exec(str,
function(error, stdout, stderr){
    console.log('stdout:'+stdout);
    console.log('stderr:'+stderr);
    if(error!=null){
        console.log('exec error: '+error);
    }
exec('bash create_q_out_list.sh',
    function(error, stdout, stderr){
        console.log('stdout:'+stdout);
        console.log('stderr:'+stderr);
        if(error!=null){
            console.log('exec error: '+error);
        }
exec('bash replaceString.sh',
    function(error, stdout, stderr){
        console.log('stdout:'+stdout);
        console.log('stderr:'+stderr);
        if(error!=null){
            console.log('exec error: '+error);
        }
        });
    });
});

В приведенном выше коде 'bash replaceString.sh' создает файл HTML, который я отображаю в Iframe моей домашней веб-страницы. Но иногда перед созданием нового файла (т.е. завершается 3-я команда bash) JS показывает мой старый файл в Iframe. Итак, в конце, хотя мой HTML-файл содержит правильное содержимое, старое содержимое уже было отображено.

Ниже приводится Ифраме:

<iframe id='svg_frame' src="http://127.0.0.1:3000/render.html"></iframe>

Кроме того, это часть моего сервера ( render.html - это файл, который генерируется третьей командой bash):

app.get('/render.html', (req, res) =>{
  const rend = fs.readFileSync('./render.html');
  res.statusCode = 200;
  res.setHeader = ('Content-Type', 'text/html');
  res.write(rend);
  res.end();
});

Я хочу, чтобы Node.js дождался создания нового файла render.html, прежде чем что-либо отобразить в Iframe.

1 Ответ

0 голосов
/ 05 июля 2019

Kinda согласен с утверждением @ Plixxer, если это простая операция, такая как замена строки, просто придерживайтесь JS на узле, но независимо от того, я думаю, что ваша проблема в

app.get('/render.html', (req, res) =>{
  const rend = fs.readFileSync('./render.html');
  res.statusCode = 200;
  res.setHeader = ('Content-Type', 'text/html');
  res.write(rend);
  res.end();
});

конкретно здесь const rend = fs.readFileSync('./render.html');

если этот файл существует ДО того, как вы замените материал своим bash-скриптом, узел просто получит его из файловой системы и передаст его клиенту, он не знает, что что-то происходит в фоновом режиме)это означает, что вы должны будете выполнить замену в блоке app.get():


app.get('/render.html', (req, res) =>{
  let rend = fs.readFileSync('./render.html');
  rend = rend.replace('<regex or whatever you are replacing in bash>', '<replacment, can be a function as well!>');
  // or of course execute your bash replacement script here!
  //   exec('bash replaceString.sh', rend,
  //     function(error, stdout, stderr) {
  //       console.log('stdout:', stdout);
  //       console.log('stderr:', stderr);
  //       if ( error !== null ) {
  //           console.log('exec error:', error);
  //       }
  //     }
  //   );
  res.statusCode = 200;
  res.setHeader = ('Content-Type', 'text/html');
  res.write(rend);
  res.end();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...