简单的REST应用程序在本地运行,但不在heroku中运行

tmb3ates  于 2023-02-16  发布在  其他
关注(0)|答案(3)|浏览(155)

我正在创建一个REST应用程序,它发布2个图像(base64字符串),以便使用Resemble js进行比较。在我的本地,当我启动服务器并使用postman进行测试时,它工作正常。我将相同的代码部署到Heroku并使用相同的数据测试heroku端点,它向我抛出了一个错误。
这是我的代码。

const express = require('express');
const app = express();
let port = process.env.PORT || 3000;
const bodyParser = require('body-parser');
const resemble = require("resemblejs");

app.use(bodyParser.json());

app.get('/', (req, res) => {
    res.send('Hello World!!');
})

app.post('/', (req, res) => {
    console.log(req.body);
    var src = req.body.src;
    var dest = req.body.dest;

    resemble(src).compareTo(
        dest
    ).ignoreColors().onComplete(data => {
        console.log(JSON.stringify(data));
        res.send(JSON.stringify(data));
    }).catch(err => {
        console.log(err);
    });

})

app.listen(port, () => {
    console.log(`Listening on port ${port}`);
})

您可以测试api here
使用命令heroku logs --tail --app resemble-js-sf查看heroku日志时出现的错误

2021-01-24T09:11:37.128025+00:00 heroku[web.1]: State changed from crashed to starting
2021-01-24T09:11:41.023786+00:00 heroku[web.1]: Starting process with command `node index.js`
2021-01-24T09:11:43.522499+00:00 app[web.1]: internal/modules/cjs/loader.js:1057
2021-01-24T09:11:43.522520+00:00 app[web.1]: return process.dlopen(module, path.toNamespacedPath(filename));
2021-01-24T09:11:43.522521+00:00 app[web.1]: ^
2021-01-24T09:11:43.522521+00:00 app[web.1]: 
2021-01-24T09:11:43.522522+00:00 app[web.1]: Error: /app/node_modules/canvas/build/Release/canvas.node: invalid ELF header
2021-01-24T09:11:43.522522+00:00 app[web.1]: at Object.Module._extensions..node (internal/modules/cjs/loader.js:1057:18)
2021-01-24T09:11:43.522522+00:00 app[web.1]: at Module.load (internal/modules/cjs/loader.js:863:32)
2021-01-24T09:11:43.522523+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:708:14)
2021-01-24T09:11:43.522523+00:00 app[web.1]: at Module.require (internal/modules/cjs/loader.js:887:19)
2021-01-24T09:11:43.522523+00:00 app[web.1]: at require (internal/modules/cjs/helpers.js:74:18)
2021-01-24T09:11:43.522524+00:00 app[web.1]: at Object.<anonymous> (/app/node_modules/canvas/lib/bindings.js:3:18)
2021-01-24T09:11:43.522524+00:00 app[web.1]: at Module._compile (internal/modules/cjs/loader.js:999:30)
2021-01-24T09:11:43.522524+00:00 app[web.1]: at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
2021-01-24T09:11:43.522525+00:00 app[web.1]: at Module.load (internal/modules/cjs/loader.js:863:32)
2021-01-24T09:11:43.522525+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:708:14)
2021-01-24T09:11:43.574021+00:00 heroku[web.1]: Process exited with status 1
2021-01-24T09:11:43.616109+00:00 heroku[web.1]: State changed from starting to crashed
2021-01-24T10:12:33.734281+00:00 heroku[web.1]: State changed from crashed to starting
2021-01-24T10:12:36.481044+00:00 heroku[web.1]: Starting process with command `node index.js`
2021-01-24T10:12:39.939626+00:00 app[web.1]: internal/modules/cjs/loader.js:1057
2021-01-24T10:12:39.939641+00:00 app[web.1]: return process.dlopen(module, path.toNamespacedPath(filename));

请让我知道我哪里出了问题,我该如何解决?

svdrlsy4

svdrlsy41#

关键错误在于:

Error: /app/node_modules/canvas/build/Release/canvas.node: invalid ELF header

ELF头是二进制文件的一部分,例如为特定操作系统和CPU架构编译的库。如果ELF二进制文件与运行它的系统不兼容,它将无法工作,“无效的ELF头”是一个很好的提示,表明这是正在发生的事情。
在这种情况下,您会遇到这个错误,因为您提交了node_modules/文件夹,其中包含您的Node.js库,其中一些库必须是针对与Heroku的基础设施不兼容的低级库编译的(而不是仅依赖于JavaScript代码)。
取消跟踪node_modules/目录、提交并重新部署,例如:

git rm -r --cached node_modules
git commit -m "Remove node_modules from repository"
git push heroku master

这让Heroku自己安装依赖项,确保获得兼容的版本。

esbemjvw

esbemjvw2#

所以,有两件事。

不要提交node_modules

不要提交node_modules。如果提交了,请根据@Chris的回答删除它。
您的resemblejs模块依赖于一个名为canvas的模块,Canvas加载了一堆名为Cairo的原生(非Javascript)代码来处理图像。
当你将节点应用推送到heroku时,它会重复你可以在本地执行的相同的npm install操作,并加载你的package.jsonpackage-lock.json中提到的所有模块。
但是,您检查node_modules目录时混淆了heroku进程。(您还在git repo中放置了一大堆不必要的东西,使其远远大于需要的大小。)看起来Heroku已经决定不需要编译Cairo代码,因为它已经显示在您的node_modules目录中。它会尝试运行本地代码,当它尝试运行可执行程序时,发现它是用于错误的操作系统,这就是Error: some/file/canvas.node: invalid ELF header的意思,ELF模块是Linux / FreeBSD / UNIX executable and linkable format对象模块。(我猜您的开发机器不是Linux Ubuntu 18机器,不像他们在heroku-18堆栈中使用的机器。)
您必须删除node_modules子目录并提交该更改。

使用nodejs的兼容版本

在packages.json文件中提到这一点,Heroku上应该可以正常工作。

"engines": {
    "node": "12.0.x"
  },
z4iuyo4d

z4iuyo4d3#

在我的示例中,我必须将node_modules添加到.dockerignore文件中

相关问题