Node js Google App Engine中的child_process

时间:2019-09-27 08:58:08

标签: node.js express google-cloud-platform child-process

我有一个可以在localhost上运行的Node Express服务器。它使用child_process运行C ++独立可执行文件。

使用child_process的代码如下(应用程序创建output.txt):

app.post('/generate', async function(req, res)
{
    var input1 = req.body.input1;
    var input2 = req.body.input2;

    var execFile = require('child_process').execFile;

    var program = "path/to/executable";
    var args    = [input1, input2];

    var child = execFile(program, args,
        function (error, stdout, stderr){           
            console.log(error);
            console.log(stdout);
            console.log(stderr);

            const file = __dirname + "/output.txt"
            app.get('/output.txt', function (req, res) {
                res.sendFile(path.join(__dirname + '/output.txt'));
            });
            res.send("/output.txt");
        })
})

这在本地有效。

我现在正尝试使用App Engine将其部署在Google Cloud Platform上。

但是,当我进入托管的网站并启动此POST /generate请求时,没有得到预期的输出。在我的项目的Google Cloud Platform日志中,我可以看到以下错误:

 textPayload: "{ Error: spawn cpp/web_cpp_app/x64/Debug/web_cpp_app ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
" 

起初我不理解该错误,但是现在我可以看到,如果我在本地运行同一项目,但是将独立可执行文件的路径设置为无效路径,则会遇到相同的错误。我猜想在部署时,我的可执行文件不包括在内?

我需要在package.jsonapp.yaml文件中添加一些特定的东西来包含可执行文件吗?

编辑: 可能是应用程序引擎在Linux上运行,而我的可执行文件是在Windows上吗?

2 个答案:

答案 0 :(得分:1)

根据Doc NodeJS的Appengine标准,您使用的操作系统是正确的,使用Ubuntu OS,灵活使用Debian。

关于可执行文件的兼容性,我发现这个post

答案 1 :(得分:1)

ENOENT的意思是“没有这样的文件或目录”,因此您的路径可能错误,或者容器无法将该程序识别为可执行文件。

但是无论哪种方式,部署时都需要在项目目录中构建child_process程序的与Linux兼容的二进制文件并将其包括在内。您可以手动构建它,也可以使用类似Cloud Build的东西在与App Engine相同的容器中进行编译。