如何使Node.js后端JavaScript在执行其他操作之前先等待bash脚本完成

时间:2019-07-05 16:44:35

标签: javascript node.js bash express

通过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:

<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 :(得分:0)

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脚本替换内容之前,node只会从文件系统获取该文件并将其提供给客户端,它不知道后台发生了什么事,这意味着您将需要在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();
});