如何从节点在Heroku上运行可执行文件,在本地工作

use*_*305 5 c++ heroku node.js express buildpack

这是我的第一个SE问题.通常我可以通过这个伟大的网站轻松找到答案,但遗憾的是,在这个场合,我找不到任何关于我在寻找的东西,无论是在这里还是其他地方.让我解释一下这个问题:

我编写了一个C++程序来进行一些数值计算.它需要命令行参数并写入stdout,并在运行OSX的系统上正常工作.

我希望在线托管这个版本,让我的同行更容易地尝试一下,所以我编写了一些Node.js和Express代码来从表单中获取输入并将其作为命令行参数提供给可执行文件.然后我按以下方式执行名为'factoriser'的二进制文件:

const exec = require('child_process').exec;
app.post('/', function (req, res) {
    var input = req.body.numberinput; //Number entered on the webpage

    const child = exec('./numericcomp ' + input, {timeout: 20000}, function(error, stdout, stderr) {
        //Code here writes stdout to the page
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的工作完全在我的本地机器上但是当我将它部署到Heroku然后尝试输入(这里我试过2131)我得到一个错误:

Error: Command failed: ./numericcomp 2131 ./numericcomp: 3: ./numericcomp: Syntax error: word unexpected (expecting ")")
Run Code Online (Sandbox Code Playgroud)

这是exec中的回调.

所以我真的不知道该怎么做,问题是Heroku只是没有正确运行可执行文件.关于Heroku如何工作,我并不是特别了解,我已经阅读了有关buildpacks等的信息,但是执行二进制文件似乎是一个非常复杂的过程.是因为我只有一个dyno并且无法运行子进程吗?

如果有人能指出我正确的方向,我会非常感激,似乎我已经完成了所有艰苦的工作,但无法克服最后的障碍.

use*_*305 16

好吧,我已经让它工作了,这可能是很多人感兴趣所以我会发布我是如何做到的.

问题是Heroku的架构与我的机器上的架构不同,因此编译的程序根本无法在Heroku上运行.为了解决这个问题,我创建了一个makefile来编译C++源代码并将其推送到Heroku使用

$ git push heroku master
Run Code Online (Sandbox Code Playgroud)

然后

$ heroku run bash
Run Code Online (Sandbox Code Playgroud)

它本质上设置了一个bash shell,可以访问你的Heroku实例.

从这里开始,使用编译可执行文件

$ make
Run Code Online (Sandbox Code Playgroud)

然后scp将此可执行文件返回到本地计算机然后

$ git add .
$ git commit -m "added working executable"
Run Code Online (Sandbox Code Playgroud)

$ git push heroku master
Run Code Online (Sandbox Code Playgroud)

然后工作的可执行文件将在Heroku应用程序上,并将像在本地主机上一样运行.