我有我的第一个node.js应用程序(本地运行正常) - 但我无法通过heroku(第一次w / heroku)部署它。代码如下。所以我不会写这么多代码,所以我只想说在我的网络中本地运行代码没有问题。
var http = require('http');
var fs = require('fs');
var path = require('path');
http.createServer(function (request, response) {
console.log('request starting for ');
console.log(request);
var filePath = '.' + request.url;
if (filePath == './')
filePath = './index.html';
console.log(filePath);
var extname = path.extname(filePath);
var contentType = 'text/html';
switch (extname) {
case '.js':
contentType = 'text/javascript';
break;
case '.css':
contentType = 'text/css';
break;
}
path.exists(filePath, function(exists) {
if (exists) {
fs.readFile(filePath, function(error, content) {
if (error) {
response.writeHead(500);
response.end();
}
else {
response.writeHead(200, { 'Content-Type': contentType });
response.end(content, 'utf-8');
}
});
}
else {
response.writeHead(404);
response.end();
}
});
}).listen(5000);
console.log('Server running at http://127.0.0.1:5000/');
有什么想法吗?
答案 0 :(得分:836)
Heroku动态地为您的应用分配一个端口,因此您无法将端口设置为固定数字。 Heroku将端口添加到env,因此您可以从那里拉出它。切换你的听:
.listen(process.env.PORT || 5000)
这样,当你在本地进行测试时它仍然会听取端口5000,但它也适用于Heroku。
您可以在Node.js here上查看Heroku文档。
答案 1 :(得分:25)
在使用yeoman的angular-fullstack生成的项目并删除为我工作的IP参数时,我遇到了同样的问题。
我替换了这段代码
server.listen(config.port, config.ip, function () {
console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
带
server.listen(config.port, function () {
console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
});
答案 2 :(得分:24)
当Heroku 无法绑定server.listen(port, [host], [backlog], [callback])
处的端口或主机名时,会发生错误。
Heroku要求的是.listen(process.env.PORT)
或.listen(process.env.PORT, '0.0.0.0')
更一般地说,为了支持其他环境,请使用:
var server_port = process.env.YOUR_PORT || process.env.PORT || 80;
var server_host = process.env.YOUR_HOST || '0.0.0.0';
server.listen(server_port, server_host, function() {
console.log('Listening on port %d', server_port);
});
答案 3 :(得分:19)
值得一提的是,如果您的代码未指定端口,那么不应该是web
进程,而应该是worker
进程。
因此,将Procfile
改为阅读(填写您的特定命令):
worker: YOUR_COMMAND
然后也在CLI上运行:
$ heroku scale worker=1
答案 4 :(得分:16)
对于同时通过端口和主机的用户,请注意Heroku 不会绑定到 localhost
。
您必须将 0.0.0.0
传递给主持人。
即使您使用了正确的端口。我们不得不进行这种调整:
# port (as described above) and host are both wrong
const host = 'localhost';
const port = 3000;
# use alternate localhost and the port Heroku assigns to $PORT
const host = '0.0.0.0';
const port = process.env.PORT || 3000;
然后你可以像往常一样启动服务器:
app.listen(port, host, function() {
console.log("Server started.......");
});
您可以在此处查看更多详细信息:https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error
答案 5 :(得分:8)
就我而言,我正在使用https://hapijs.com/
中的示例要解决问题我已更换
server.connection({
host: 'localhost',
port: 8000
});
带
server.connection({
port: process.env.PORT || 3000
});
答案 6 :(得分:5)
虽然这里的大多数答案都是有效的,但对我来说问题是我正在运行长时间的进程作为导致超时的 npm run start
的一部分。
我找到了解决方案 here,总结一下,我只需要将 npm run build
移至 postinstall
任务。
换句话说,我改变了这个:
"start": "npm run build && node server.js"
为此:
"postinstall": "npm run build",
"start": "node server.js"
仔细想想,这是完全有道理的,因为随着我的应用不断增长,这个错误(曾经偶尔出现)变得越来越普遍。
答案 7 :(得分:4)
更改此行
<div class="hero-container-2">
<span id="contactus"></span>
<p><span id="contactus">Itching to ask us a question about the club? Want to pick our brains about training, competing or joining? (We usually react quickly, but it might take us a handful of days to reply).</span></p>
<div class="buttom">
<span id="contactus">Contact Us</span>
</div>
</div>
到
app.listen(port);
它将起作用
答案 8 :(得分:3)
答案 9 :(得分:2)
我遇到了同样的问题,将侦听端口从3000更改为(process.env.PORT || 5000)解决了该问题!
答案 10 :(得分:2)
就我而言,我使用Babel和 babel-plugin-transform-inline-environment-variables 插件。显然,Heroku在进行部署时没有设置PORT env变量,因此process.env.PORT
将被undefined
替换,并且您的代码将回退到Heroku不知道的开发端口。
答案 11 :(得分:1)
以下步骤解决了我的解决方案:
将 package.json 编辑为:
...
"engines": {
"node": "5.0.0",
"npm": "4.6.1"
},
...
和 Server.js 为:
...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
答案 12 :(得分:1)
在我尝试过的所有解决方案中没有按预期工作,我默认研究heroku .env文件应该维护约定PORT,process.env.PORT,heroku默认会查找关键字PORT。
取消任何重命名,例如APP_PORT =而不是在你的env文件中使用PORT =。
答案 13 :(得分:1)
使用 process.env.PORT || 3000
作为您的端口。
这将在可用时使用 Heroku 的端口,如果不可用则使用端口 3000(例如,本地测试)
您可以将 3000 更改为您想要的任何值,例如 8080
答案 14 :(得分:1)
在开发应用程序时,我们需要按以下方式定义端口:
const port = process.env.PORT || 4000; // PORT must be in caps
并在将应用程序部署到服务器时添加以下方法:
app.listen(port, () => {
console.info("Server started listening.");
});
我们可以在本地运行时将主机名作为第二个参数传递。但是在将其部署到服务器时,应删除主机名参数。
app.listen(port, hostName, () => {
console.info(`Server listening at http://${hostName}:${port}`);
});
答案 15 :(得分:1)
我花了很多时间寻找根本原因,最终我发现这个超时(60 秒)是可以调整的。 Here 您可以将 60 秒更改为 120 秒甚至更多。它对我有用,希望对其他人有帮助!
答案 16 :(得分:0)
我建议您仔细阅读日志,以便轻松排除故障。
如果您将 PORT 作为环境变量 (env) 引用,请确保它是 PORT
而不是 port
,因为在您部署应用程序时,heroku 会自动为其分配一个 PORT
编号。 process.env.PORT
不是 process.env.port
答案 17 :(得分:0)
要解决此问题,请执行以下四个简单步骤: 在 package.json 文件中:
1- 将主字段设置为服务器文件:
"main": "server.js" // <-- here set you server file
2- 在 app.listen 函数中添加 host 参数
const port = process.env.PORT || 3000;
const host = '0.0.0.0'
app.listen(port, host, ()=> connsole.log(`server is running on port ${port}`)
3- 将安装后脚本添加到 package.json 文件中
"scripts": {
"postinstall": "npm run build", // <-- add this line
"start": "node server.js" // <-- change server.js to you main file
}
4- 在 package.json 文件中添加引擎字段
"engines": {
"node": ">=14.0.O", // <-- change it to your node version. you can "node -v" in you command line
"npm": ">=7.7.0" // <-- change this to your npm version. you can use "npm -v" in the command line to get your npm version
}
如果您有任何成功,请告诉我!
答案 18 :(得分:0)
我有同样的问题,但是我的环境变量设置正确,并且在package.json中指定了npm和node的版本。我发现这是因为,就我而言,Heroku需要在 package.json 中指定“开始” :
"scripts": {
"start": "node index.js"
}
将其添加到package.json后,我的节点应用程序已成功部署在Heroku上。
答案 19 :(得分:0)
我的情况是我在启动时运行数据库脚本并且花费了很长时间。我通过在部署完成后手动运行 type
解决了这个问题。
答案 20 :(得分:0)
即使我来不及,但这也可能会帮助在未来几天内也会陷于困境的人。 我遇到了同样的问题,但是我的问题是使用npm start运行许多命令。 我正在运行创建表并在启动应用程序之前插入数据,并在运行之前超过了10秒。因此,我删除了这些命令并解决了问题。
谢谢
答案 21 :(得分:0)
我的问题是,当部署到heroku时出现错误:
Web进程在启动后60秒内未能绑定到$ PORT
在终端上运行heroku logs --tail
时。但是当我在本地运行服务器时,应用程序将按预期运行。
我在index.js
文件(服务器文件)中有此文件
const PORT = process.env.port || 4000
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`)
})
但是应该有这个
const PORT = process.env.PORT || 4000
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`)
})
使用process.env.PORT
而不是process.env.port
,因为显然port
与PORT
不同。
贷记到gprasant。
答案 22 :(得分:0)
就我而言,端口和主机都不是问题。 我们的index.js分为2个文件 server.js
//server.js
const express = require('express')
const path = require('path')
const app = express()
app.use(express.static(path.resolve(__dirname, 'public')));
// and all the other stuff
module.exports = app
//app.js
const app = require('./server');
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0', () => {
console.log('Server is running s on port: ' + port)
});
在package.json中,我们运行了节点app.js
显然这是问题所在。一旦将两者合并为一个文件,heroku应用程序便按预期部署。
希望它对某人有帮助,因为我发现没有人遇到此问题
答案 23 :(得分:0)
我有同样的问题。 最终,我意识到我不需要请求端点中的端口号。 (因此端点是https://...herokuapp.com,而不是https://...herokuapp.com:5000)。
listen()调用可以不包含主机和回调: server.listen(5000);
答案 24 :(得分:0)
I Use ReactJs
If you want upload to heroku add this in your webpack.config.js
Because if not add you will have
error
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
//webpack.config.js add code like that
const HtmlWebPackPlugin = require(“html-webpack-plugin”);
const MiniCssExtractPlugin = require(“mini-css-extract-plugin”);
var server_port = process.env.YOUR_PORT || process.env.PORT || 5000;
var server_host = process.env.YOUR_HOST || ‘0.0.0.0’;
module.exports = {
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: “babel-loader”
}
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, “css-loader”]
}
]
},
devServer: {
disableHostCheck: true,
contentBase: ‘./dist’,
compress: true,
inline: true,
port:server_port,
host:server_host
},
plugins: [
new HtmlWebPackPlugin({
template: “./src/index.html”,
filename: “index.html”
}),
new MiniCssExtractPlugin({
filename: “[name].css”,
chunkFilename: “[id].css”
})
]
};
答案 25 :(得分:0)
就我而言,我有两个问题...
1)根本没有侦听器,因为正在从另一个入口文件运行应用程序,并且此运行脚本已从package.json“脚本”中删除
2)用'Sequelize'而不是'sequelize'区分大小写的问题
答案 26 :(得分:0)
我有同样的问题,因为我没有定义Procfile。将名为Procfile的文本文件提交到您应用的根目录,不带文件扩展名。该文件告诉Heroku要运行哪个命令来启动您的应用。
web: node app.js
答案 27 :(得分:0)
我遇到了同样的问题,但是使用express和apollo服务器。 here的解决方案:
唯一需要特别考虑的是允许 heroku选择服务器要部署到的端口。除此以外, 可能有错误,例如请求超时。
要配置apollo服务器在运行时使用Heroku定义的端口, 可以使用端口调用安装文件中的listen函数 由PORT环境变量定义:
> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => {
> console.log(`Server ready at ${url}`); });
答案 28 :(得分:0)
在heroku bash过程中,使用yargs等选项解析器将$ PORT的值传递给您的节点应用程序。
这是一个如何做到这一点的例子。在脚本对象上,在package.json中,添加一个start方法“node server --port $ PORT”。
在您的服务器文件中,使用yargs从start方法的端口选项(--port $ PORT)获取值:
const argv = require('yargs').argv;
const app = require('express')();
const port = argv.port || 8081;
app.listen(argv.port, ()=>{
console.log('Probably listening to heroku $PORT now ', argv.port); // unless $PORT is undefined, in which case you're listening to 8081.
});
现在,当您的应用启动时,它将绑定到$ PORT的动态设置值。
答案 29 :(得分:0)
无法为端口设置固定号码,heroku使用process.env.PORT
动态分配。但您可以添加它们,例如process.env.PORT || 5000
。 Heroku将使用第一个,而您的localhost将使用第二个。
您甚至可以添加回叫功能。请看下面的代码
app.listen(process.env.PORT || 5000, function() {
console.log("Server started.......");
});
答案 30 :(得分:0)
我有同样的问题我可以解决问题,替换&#39; localhost&#39;知识产权是&#39; 0.0.0.0&#39;