通过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上显示任何内容。
答案 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();
});