Heroku 应用程序 EACCES 上的 Nodejs Express 0.0.0.0:80

Posted

技术标签:

【中文标题】Heroku 应用程序 EACCES 上的 Nodejs Express 0.0.0.0:80【英文标题】:Nodejs Express on Heroku App EACCES 0.0.0.0:80 【发布时间】:2019-03-30 05:48:44 【问题描述】:

我正在尝试在他们的网络上新创建的 Heroku 应用程序上运行 Node 应用程序。我按照他们的步骤操作,但在显示应用状态时仍然出现错误。

由于我已经从网络上创建了,所以我在没有 heroku create 命令的情况下遵循了 Node.js getting started 部分。

所以当我运行时:heroku ps:scale web=1 它显示了我:

缩放测功机...完成,现在以 1:Free 运行网络

但是当运行heroku ps:

=== 网络(免费):npm run start (1)

web.1:在 2018/10/25 11:25:49 -0300(约 8m 前)崩溃

所以我在heroku logs --tail 上的日志显示了这个错误:

2018-10-25T14:25:44.000000+00:00 app[api]:构建成功

2018-10-25T14:25:46.451739+00:00 heroku[web.1]:使用命令npm run start启动进程

2018-10-25T14:25:49.113832+00:00 应用[web.1]:

2018-10-25T14:25:49.113864+00:00 app[web.1]: > my-app@1.0.0 start /app

2018-10-25T14:25:49.113866+00:00 app[web.1]: > node server.js

2018-10-25T14:25:49.113867+00:00 应用[web.1]:

2018-10-25T14:25:49.418151+00:00 app[web.1]: events.js:167

2018-10-25T14:25:49.418191+00:00 app[web.1]: throw er; // 未处理的“错误”事件

2018-10-25T14:25:49.418193+00:00 应用[web.1]:^

2018-10-25T14:25:49.418194+00:00 应用[web.1]:

2018-10-25T14:25:49.418196+00:00 app[web.1]:错误:监听 EACCES 0.0.0.0:80

所以我检查了我在设置时是否犯了错误。

我用这个代码使用一个简单的 Express 路由和服务器:

app.get('/', (req, res) =>  ... );
app.listen(80, err => 
    if(err) throw err;
    console.log("%c Server running", "color: green");
);

我还确保将engines 添加到package.json

"scripts": 
    "start": "node server.js"
,
"engines": 
    "node": "10.11.0",
    "npm": "6.4.1"
,

我还在根路径中创建了一个 Procfile 文件,其中包含web: npm run start

因此,当所有内容都检查完毕后,我只需运行这些命令,一切看起来都很好,直到我检查日志或访问应用程序:

git commit -am "my commit text"
git push heroku master

我在日志中看到了这一点:

远程:----->正在压缩...

远程:完成:18.3M

远程:-----> 正在启动...

远程:已发布 v12

远程:https://my-app.herokuapp.com/ 部署到 Heroku

远程:

远程:验证部署...完成。

致https://git.heroku.com/my-app.git

3656da0..f1eb078 主 -> 主

所以...关于我做错了什么有什么建议吗?提前致谢。

【问题讨论】:

【参考方案1】:

您需要在环境变量中为应用提供监听端口。 heroku 所做的是它在动态端口上运行我们的应用程序。

试试这个:

const PORT = process.env.PORT || 3000;
app.listen(PORT, err => 
    if(err) throw err;
    console.log("%c Server running", "color: green");
);

另外你不应该将端口绑定到 80,因为它是一个保留的标准 http 端口。

【讨论】:

好的……它成功了。谢谢你。但是我已经尝试过使用端口 3000 并且是一样的。我正在测试。 端口 3000 以防万一环境变量未定义。 Heroku 将动态端口分配给环境变量【参考方案2】:

Heroku dynos 公开了一个动态端口供您的应用绑定。该值在 $PORT 环境变量中公开。您必须更改代码以绑定到此端口。

const port = process.env.PORT || 80;

app.listen(port, err => 
    if(err) throw err;
    console.log("%c Server running", "color: green");
);

【讨论】:

以上是关于Heroku 应用程序 EACCES 上的 Nodejs Express 0.0.0.0:80的主要内容,如果未能解决你的问题,请参考以下文章

无法通过节点休息应用程序上的mongoose连接到mongodb-altas,连接失败:“UnhandledPromiseRejectionWarning:错误:连接EACCES”

如何避免使用 KITKAT 4.4.2 版本的 SD 卡上的“EACCES 权限被拒绝”。谷歌的新政策

BitmapFactory:无法解码流:java.io.FileNotFoundException:打开失败:Android Q 上的 EACCES(权限被拒绝)

“Errno::EACCES ...权限被拒绝”运行指南针手表

heroku 上的应用程序错误无法更新 heroku 配置

错误:EACCES:权限被永远拒绝