我正在创建一个REST应用程序,它可以发布2个图像(base64字符串),以便使用相似的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}`);
})
您可以测试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));
请让我知道我哪里出错了,我如何才能修复它?
发布于 2021-01-24 22:47:25
关键错误在这里:
Error: /app/node_modules/canvas/build/Release/canvas.node: invalid ELF header
ELF header是二进制文件的一部分,例如为特定操作系统和CPU架构编译的库。如果ELF二进制文件与它运行的系统不兼容,它将无法工作,"invalid ELF header“是一个很好的提示,表明这里正在发生这种情况。
在这种情况下,您会收到此错误,因为您已经提交了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自己安装依赖项,确保获得兼容的版本。
发布于 2021-01-24 22:51:26
所以,这里有两件事。
不要提交node_modules
。
不要提交node_modules
。如果有,请根据@Chris的回答将其删除。
您的resemblejs
模块依赖于一个名为canvas
的模块。Canvas加载了一堆本机(而不是Javascript)代码,称为Cairo,用于处理图像。
当您将您的节点应用程序推送到heroku时,它会重复您可以在本地执行的相同npm install
操作,并加载您的package.json
和package-lock.json
中提到的所有模块。并且,在加载操作期间,它会根据需要编译本机代码。
但是,通过检查您的node_modules
目录,您已经混淆了heroku进程。(您还在git代码库中放了一大堆不必要的东西,使其大大超出了需要的大小。)看起来Heroku已经决定不需要编译Cairo代码,因为它已经出现在你的node_modules
目录中了。因此,当您使用代码时,它会尝试运行本机代码。当它试图运行可执行程序时,它会发现可执行程序是用于错误的操作系统。这就是Error: some/file/canvas.node: invalid ELF header
的意思。ELF模块是Linux / FreeBSD / UNIX对象模块。(我猜您的开发机器不是他们在heroku-18
堆栈中使用的Linux Ubuntu18机器。)
您必须删除node_modules子目录并提交更改。
使用兼容版本的nodejs
canvas
is touchy about versions of nodejs。在您的packages.json文件中提到这一点,这应该可以在Heroku上运行。
"engines": {
"node": "12.0.x"
},
https://stackoverflow.com/questions/65871698
复制相似问题