我正在创建一个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));
请让我知道我哪里出了问题,我该如何解决?
3条答案
按热度按时间svdrlsy41#
关键错误在于:
ELF头是二进制文件的一部分,例如为特定操作系统和CPU架构编译的库。如果ELF二进制文件与运行它的系统不兼容,它将无法工作,“无效的ELF头”是一个很好的提示,表明这是正在发生的事情。
在这种情况下,您会遇到这个错误,因为您提交了
node_modules/
文件夹,其中包含您的Node.js库,其中一些库必须是针对与Heroku的基础设施不兼容的低级库编译的(而不是仅依赖于JavaScript代码)。取消跟踪
node_modules/
目录、提交并重新部署,例如:这让Heroku自己安装依赖项,确保获得兼容的版本。
esbemjvw2#
所以,有两件事。
不要提交
node_modules
。不要提交
node_modules
。如果提交了,请根据@Chris的回答删除它。您的
resemblejs
模块依赖于一个名为canvas
的模块,Canvas加载了一堆名为Cairo的原生(非Javascript)代码来处理图像。当你将节点应用推送到heroku时,它会重复你可以在本地执行的相同的
npm install
操作,并加载你的package.json
和package-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上应该可以正常工作。
z4iuyo4d3#
在我的示例中,我必须将node_modules添加到.dockerignore文件中