【问题标题】:REST API parallel bash commands in NodeJSNodeJS 中的 REST API 并行 bash 命令
【发布时间】:2025-12-31 20:05:03
【问题描述】:

我想用 NodeJS 创建一个 Express 服务器,其中一个端点需要执行繁重的 bash 操作。但是这样做会疯狂地减慢整个服务器的速度!例如我创建了一个端点/ping,它只是在后台执行ping 8.8.8.8 命令并返回结果。

如果我向服务器发起 2 个并行请求,它们会互相阻塞并一个接一个地执行:

blocking requests

我尝试使用工作线程,但无法完成。这在 NodeJS 中是否可行?如果不是......我怎么能做到这一点?

【问题讨论】:

  • 您需要向我们展示用于执行 ping 的服务器端代码。您是否使用阻塞呼叫?如果不是,这可能是由浏览器本身引起的,而不是由您的服务器引起的(为了优化缓存),如果您从浏览器发出多个相同的请求,它会等待第一个请求看是否可以使用(通过缓存)用于后续请求。您可以通过向每个请求添加可变查询参数 /ping?id=1/ping?id=2 来绕过它,然后 URL 不再相同,但它们仍会转到您服务器上的相同路由。
  • 不应要求工作线程。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: node.js multithreading express npm node-worker-threads


【解决方案1】:

对于使用参数的工作线程修复了浏览器中的问题!

但是我没有工作线程的旧代码不起作用:

app.get('/test', (req, res) => {
  
    /* create new uuid to find xml */
    Object.assign(req.body, {id: uuid()});

    exec(`C:/Progress/DLC117-x32/bin/_progres.exe -b -db ${db} -U ${user} -P ${password} -H ${host} -S ${service} -ld basis -N TCP -T C:/temp -Mm 16384 -cpstream 1252 -cpinternal 1252 -cpcoll BASIC -p pa/procedure.p`,
    (error, stdout, stderr) => {
        if (error) {
            logger.log(`error: ${error.message}`);
            res.statusCode = 400;
            res.end(`${error.message}`);
            return;
        }
        if (stderr) {
            logger.log(`error: ${stderr}`);
            res.statusCode = 400;
            res.end(`${stderr}`);
            return;
        }
        if(stdout != "") {
            res.statusCode = 200;
            res.end(`${stdout}`)
            return;
        }
        
        /* file was successfully written */
        fs.readFile(path.join(__dirname, 'exports', req.body.id + '.xml'), (err, data) => {
            if(err) {
                logger.log(`xml-read-error: ${err}`);
                res.end(`${err}`);
                return;
            }  
            res.end(xmlParser.toJson(data));
        });         
    });
});

【讨论】: