如何在Node.js中同步执行Shell脚本,完成后再执行页面重定向?
解决Shell脚本执行完毕后再重定向的问题
你的问题核心在于exec是异步执行的,当前代码里res.redirect('/Visualise')会在脚本刚启动就立刻执行,根本等不及脚本生成输出文件。要解决这个问题,你需要监听子进程的close事件——这个事件会在Shell脚本**完全执行完毕(不管成功还是失败)**后触发,这时候再执行重定向就没问题了。
修改后的代码如下:
router.post('/', function(req, res, next) { var id = req.body.id; console.log(id); const testscript = exec('sh script.sh'); testscript.stdout.on('data', function(data){ console.log(data); // sendBackInfo(); }); testscript.stderr.on('data', function(data){ console.log(data); // triggerErrorStuff(); }); // 监听子进程关闭事件,脚本执行完毕后再重定向 testscript.on('close', (code) => { console.log(`脚本执行完毕,退出码:${code}`); // 可选:根据退出码判断执行结果,再决定跳转逻辑 // if (code === 0) { // res.redirect('/Visualise'); // } else { // res.redirect('/error'); // } res.redirect('/Visualise'); }); });
关键点说明:
close事件是子进程结束的可靠标志,它会在所有标准输出/错误流都关闭后触发,确保脚本的所有操作(包括生成输出文件)都已经完成。- 通过
code参数可以获取脚本的退出码,0通常代表执行成功,非0代表出错,你可以根据这个扩展逻辑,比如执行失败时跳转到错误提示页面,让整个流程更健壮。
内容的提问来源于stack exchange,提问作者vatsa
相关产品推荐
相关产品推荐

