首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单的REST应用程序在本地运行,但不能在heroku中运行

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

Stack Overflow用户
提问于 2021-01-24 22:22:49
回答 2查看 309关注 0票数 0

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

这是我的代码。

代码语言:javascript
运行
复制
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日志时得到的错误

代码语言:javascript
运行
复制
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));

请让我知道我哪里出错了,我如何才能修复它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-24 22:47:25

关键错误在这里:

代码语言:javascript
运行
复制
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/目录,提交并重新部署,例如:

代码语言:javascript
运行
复制
git rm -r --cached node_modules
git commit -m "Remove node_modules from repository"
git push heroku master

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

票数 2
EN

Stack Overflow用户

发布于 2021-01-24 22:51:26

所以,这里有两件事。

不要提交node_modules

不要提交node_modules。如果有,请根据@Chris的回答将其删除。

您的resemblejs模块依赖于一个名为canvas的模块。Canvas加载了一堆本机(而不是Javascript)代码,称为Cairo,用于处理图像。

当您将您的节点应用程序推送到heroku时,它会重复您可以在本地执行的相同npm install操作,并加载您的package.jsonpackage-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上运行。

代码语言:javascript
运行
复制
  "engines": {
    "node": "12.0.x"
  },
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65871698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档