node.js child_进程在运行某些进程时返回code=null

node.js child_进程在运行某些进程时返回code=null,node.js,heroku,child-process,Node.js,Heroku,Child Process,我在prod环境中生成child_进程时遇到了一个问题。在我的开发环境(windows)中,一切都很好,但是当我进入生产环境(Heroku)时,一些子进程失败并返回code=null。下面是我的代码: router.get('/element/chart/:id', ensureAuthenticated, (req,res) => { var current_data_page_id = req.params.id const path = require('path')

我在prod环境中生成child_进程时遇到了一个问题。在我的开发环境(windows)中,一切都很好,但是当我进入生产环境(Heroku)时,一些子进程失败并返回code=null。下面是我的代码:

router.get('/element/chart/:id', ensureAuthenticated, (req,res) => {
    var current_data_page_id = req.params.id
    const path = require('path')
    const {spawn} = require('child_process')
    let runScript;
    
    runScript = (current_data_page_id) => {
        switch(current_data_page_id) {
            case "100":
                return spawn('python', ["-u", path.join(process.cwd(),'/python/python_func_1.py')]); 
            break;
            case "101":
                return spawn('python', ["-u", path.join(process.cwd(),'/python/python_func_2.py')]);
            break;
            case "102":
                return spawn('python', ["-u", path.join(process.cwd(),'/python/python_func_3.py')]);
            break;
            case "103":
                return spawn('python', ["-u", path.join(process.cwd(),'/python/python_func_4.py')]);
            break;
            case "200":
                return spawn('python', ["-u", path.join(process.cwd(),'/python/python_func_5.py')]);
            break;
            case "201": 
                return spawn('python', ["-u", path.join(process.cwd(),'/python/python_func_6.py')]);
            break;
            default:
                console.log("Data page ID does not match current options") 
        };
    };
    
    const subprocess = runScript(current_data_page_id)
    // print output of script
    subprocess.stdout.on('data', (data) => {
        console.log("HERE I AM")
        var dataToSend = data.toString();
        res.write(dataToSend);
    });
    
    //NEW Dx CODE
    subprocess.on('error', (err) => {
        console.log(`Spawn error: ${err}`)
    });

    subprocess.stderr.on('data', (data) => {
        console.log(`error:${data}`);
        return;
    });
    subprocess.stderr.on('close', () => {
        console.log("Closed");
        return;
    });
    subprocess.on('close', (code) => {
        if (code !== 0) {
            console.log(`grep process exited with code ${code}`);
        }
        res.end(); 
    });

});
例如,在生产中,case=100表示所有工作,但case=200表示失败。在开发过程中,一切都很好


我在控制台中看到的只是“关闭”和“grep进程退出,代码为null”。这两个失败的python函数共享相当多的代码。我在想,也许我在生产环境中超出了内存分配?虽然我没有任何堆栈跟踪/错误明确指出这一点。

您的
子流程在哪里('error',evt=>…)
处理程序,用于捕获生成错误(而不是执行错误)?@Mike'Pomax'Kamermans我在问题中的代码中添加了一个addtnl事件处理程序-不确定我的语法是否正确,以捕获相关事件的潜在范围(新到节点)。除了“Closed”和“grep process…code null”之外,仍然没有其他控制台活动“您可能需要将其转换为一个,尽管有一个不同的注意事项:为什么您要按需运行python脚本,而不是让python作业处理程序并行运行,您可以通过REST调用来请求运行?是否有一种方法可以记录为什么操作系统发送了结束我的child_进程的信号,即使“error”事件没有涵盖它?同时也表明,OOM_杀手是这种行为的常见罪魁祸首。有没有办法为spawn中的子进程提供更多的内存来测试这一点?因此我的问题是:为什么在这里使用子进程,而不是让python服务运行,您可以要求它使用REST调用来完成工作(例如,让python做python的事情,让node做node的事情,让node通过相同的机器HTTP调用向python请求数据?)