赫罗库+;node.js错误(Web进程未能在启动后60秒内绑定到$PORT)
我有我的第一个node.js应用程序(在本地运行良好)-但我无法通过heroku部署它(第一次也是使用heroku)。代码如下。所以我不想写那么多代码,所以我只想说,在我的网络中本地运行代码没有问题赫罗库+;node.js错误(Web进程未能在启动后60秒内绑定到$PORT),node.js,heroku,Node.js,Heroku,我有我的第一个node.js应用程序(在本地运行良好)-但我无法通过heroku部署它(第一次也是使用heroku)。代码如下。所以我不想写那么多代码,所以我只想说,在我的网络中本地运行代码没有问题 var http = require('http'); var fs = require('fs'); var path = require('path'); http.createServer(function (request, response) { console.log
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/');
有什么想法吗?Heroku会动态地为你的应用程序分配一个端口,因此你不能将端口设置为固定的数字。Heroku将端口添加到env中,这样您就可以从那里提取它。切换您的手机,请听以下内容:
.listen(process.env.PORT || 5000)
这样,当您在本地测试时,它仍将侦听端口5000,但它也将在Heroku上工作
您可以在Node.js上查看Heroku文档。当Heroku无法在
服务器上绑定端口或主机名时,会发生错误。请侦听(端口、[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);
});
在使用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'));
});
与
在我的例子中,我将Babel与Babel插件转换内联环境变量一起使用。显然,Heroku在进行部署时没有设置PORT env变量,因此
process.env.PORT
将被undefined
替换,并且您的代码将退回到Heroku不知道的开发端口。在我的例子中,我使用了
为了解决我替换的问题
server.connection({
host: 'localhost',
port: 8000
});
与
值得一提的是,如果您的代码没有指定端口,那么它就不应该是
web
进程,而应该是worker
进程
因此,将您的Procfile
更改为read(填写您的特定命令):
然后还可以在CLI上运行:
heroku scale worker=1
我也有同样的问题,我可以用IP替换“localhost”,它是“0.0.0.0”无法为端口设置固定的数字,heroku使用
process.env.port
动态分配它。但是您可以同时添加它们,就像这样process.env.PORT | | 5000
。Heroku将使用第一个,而您的本地主机将使用第二个
您甚至可以添加回拨功能。请看下面的代码
app.listen(process.env.PORT || 5000, function() {
console.log("Server started.......");
});
对于同时传递端口和主机的用户,请记住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.......");
});
您可以在此处查看更多详细信息:编辑
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");
});
...
在所有我尝试过的解决方案中,没有一个像预期的那样工作,我研究heroku默认情况下.env文件应该维护约定端口,process.env.PORT,heroku默认情况下会查找关键字PORT
取消任何重命名,如APP_PORT=而不是使用env文件中的PORT=。在heroku bash进程中,使用选项解析器(如yargs)将$PORT的值传递给节点应用程序 下面是一个示例,说明您可以如何做到这一点。在scripts对象的package.json内部,添加一个启动方法“node server--port$port” 在服务器文件中,使用yargs从start方法的port选项(--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值。如果像我一样,你正在配置Heroku从部署时的
包.json
文件运行脚本,请确保你没有在该脚本中硬编码PORT
的值!如果你这样做,你最终会像我一样,花一个小时试图找出为什么会出现这个错误。将我的侦听端口从3000更改为(process.env.port | | 5000)
解决了这个问题。我也遇到了同样的问题,但express和apollo server出现了同样的问题。解决方案来自:
唯一需要特别考虑的是允许
heroku选择服务器部署到的端口。否则,,
可能存在错误,例如请求超时
要将apollo server配置为在运行时使用Heroku定义的端口,
可以使用端口调用设置文件中的listen函数
由端口环境变量定义:
我也有同样的问题,因为我没有定义
Procfile
。将名为Procfile
且不带文件扩展名的文本文件提交到应用程序的根目录。此文件告诉Heroku要运行哪个命令来启动应用程序
web: node app.js
就我而言,我有两个问题 1) 根本没有侦听器,因为正在从另一个条目文件运行应用程序,此运行脚本已从package.json“scripts”中删除 2) 使用“Sequelize”而不是“Sequelize”区分大小写的问题 我使用ReactJs, 如果您想上传到heroku,请将其添加到webpack.config.js中 因为如果不添加,您将有错误 错误R10(启动超时)->Web进程无法绑定到内的$PORT 发射60秒
我意识到我不需要请求端点中的端口号,因此端点是
herokuapp.com
,而不是herokuapp.com:5000
listen()
调用可以没有主机和回调:
server.listen(5000);
在我的例子中,端口和主机都不是问题所在。
index.js
被分为两个文件server.js
:
...
var port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0", function() {
console.log("Listening on Port 3000");
});
...
//server.js
const express=require('express')
const path=require('路径')
const app=express()
app.use(express.static(path.resolve(uu dirname,'public'));
//还有所有其他的东西
module.exports=app
//app.js
const app=require(“./server”);
const port=process.env.port | 3000;
应用程序侦听(端口'0.0.0.0',()=>{
有限公司
> server.listen({ port: process.env.PORT || 4000 }).then(({ url }) => {
> console.log(`Server ready at ${url}`); });
web: node app.js
//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"
})
]
};
server.listen(5000);
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}`)
})
app.listen(port);
app.listen(process.env.PORT, '0.0.0.0');
"scripts": {
"start": "node index.js"
}
"start": "npm run build && node server.js"
"postinstall": "npm run build",
"start": "node server.js"
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}`);
});