繁体   English   中英

如何在Node.js中同步执行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM