![](/img/trans.png)
[英]How to force AWS Cognito: signUp() to execute synchronously (nodejs)
[英]How to execute synchronously in nodejs?
我有以下代码。
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();
});
res.redirect('/Visualise');
});
我需要完全执行我的shell脚本,然后重定向到“ / Visualise”。 下一页中的代码的某些部分使用由Shell脚本生成的输出文件。 在完全执行shell脚本之前,它正在重定向,并且出现了文件未找到错误。 我如何同步执行。 请在上面的代码中进行所需的更改。 谢谢。
您可以为此使用child_process.execSync,它返回stdout:
child_process.execSync(command[, options])
例如
const child_process = require('child_process');
var response = child_process.execSync('sh script.sh');
响应将是一个Buffer对象。
文档在这里:
https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options
请注意,如果脚本超时或退出代码不为零,则此方法将引发错误,因此您可能需要使用try / catch进行包装。
要将其添加到您的代码中,请执行以下操作:
const child_process = require('child_process');
router.post('/',function(req, res, next) {
var id=req.body.id;
console.log(id);
try
{
var response = child_process.execSync('sh script.sh');
console.log('Script response: ', response.toString());
}
catch (error) {
console.error('An error occurred: ', error);
}
res.redirect('/Visualise');
});
更好的模式是异步执行此操作:
const child_process = require('child_process');
router.post('/',function(req, res, next) {
var id=req.body.id;
console.log(id);
child_process.exec('sh script.sh', (error, stdout) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
res.redirect('/Visualise');
});
});
注意:切勿将未经处理的用户输入传递给此功能,这会带来很大的安全风险。
您真正想要的是不同步执行脚本,因为那样会阻塞事件循环并阻止其他请求的运行。 相反,您需要(异步)等待脚本完成。
为此,请在子进程的exit
事件中而不是在处理程序的主体内编写重定向:
router.post('/', function(req, res, next) {
// ...whatever
const testscript = exec('sh script.sh');
// ...stdouts
testscript.on('exit', function (code, signal) {
res.redirect('/Visualise');
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.