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

时间:2016-09-25 09:47:48

标签: c++ node.js express heroku buildpack

这是我的第一个SE问题。通常我可以通过这个伟大的网站轻松找到任何答案,但不幸的是,在这种情况下,我无法在这里或其他地方找到我想要的东西。让我解释一下这个问题:

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

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

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode != Activity.RESULT_OK)
            return;
        Bitmap bitmap = null;
        String path = "";
        if(requestCode == FILE_REQUEST){
            imageCaptureUri = data.getData();
            path = getRealPathFromURI(imageCaptureUri);
            if(path != null){
                bitmap = BitmapFactory.decodeFile(path);
            }else{
                path = imageCaptureUri.getPath();
            }

        }else {
            path = imageCaptureUri.getPath();
            bitmap = BitmapFactory.decodeFile(path);

        }

        img_logo.setImageBitmap(bitmap);
        txt_image_path.setText(path);

    }

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

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
    }
}

赋予exec中的回调。

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

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

1 个答案:

答案 0 :(得分:15)

好的,我已经让它工作了,这可能是很多人感兴趣所以我会发布我是怎么做的。

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

将其推送到Heroku
module.exports = {
  myThing: {
    getMyThing: function () {
      return "This is my thing";
    },

    getMyObject: function () {
      return {
        a: 1,
        b: "my object"
      }
    }
  }
}

然后

$ git push heroku master

基本上设置了一个bash shell,可以访问你的Heroku实例。

从这里开始,使用

编译可执行文件
$ heroku run bash

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

scp

$ git add .
$ git commit -m "added working executable"

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