Node.js / Express.js应用程序只适用于端口3000
我有一个Node.js / Express.js应用程序运行在我的服务器上,只能在端口3000上工作,我试图找出原因。 这是我发现的:
- 没有指定一个端口(
app.listen()
),应用程序运行,但网页不加载。 - 在端口3001(
app.listen(3001)
)或任何其他未使用的端口上,应用程序将运行,但网页无法加载。 - 在端口2999,该应用程序抛出一个错误,因为别的东西正在使用该端口。
- 在端口3000,应用程序运行,网页加载正常。
我知道快速应用程序默认为端口3000.但奇怪的是,我的应用程序只运行时,我明确地使其在端口3000上运行( app.listen(3000)
)。
我在/usr/bin/express
第220行find了这个:
app.set(\'port\', process.env.PORT || 3000);
这是按照前面的说法来做的:将端口设置为指定的值,如果没有指定则将端口设置为3000。
我怎样才能使我的应用程序工作在不同的端口,如8080或3001?
谢谢!
编辑:代码示例(非常简单的节点/快速应用程序)
var express = require("express"); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); // Only works on 3000 regardless of what I set environment port to or how I set [value] in app.set('port', [value]). app.listen(3000);
如果你在你的app.js中有这样的东西,下面的工作:
http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); });
要么明确地硬编码你的代码来使用你想要的端口,如:
app.set('port', process.env.PORT || 3000);
此代码意味着将您的端口设置为环境variablesPORT
或如果这是undefined
然后将其设置为文字3000
。
或者,使用您的环境设置端口。 通过环境进行设置用于帮助描绘PRODUCTION
和DEVELOPMENT
之间的关系,并且许多平台即服务使用环境根据其规格和内部Expressconfiguration来设置端口。 以下设置一个环境键=值对,然后启动您的应用程序。
$ PORT=8080 node app.js
参考你的代码示例,你需要这样的东西:
var express = require("express"); var app = express(); // sets port 8080 to default or unless otherwise specified in the environment app.set('port', process.env.PORT || 8080); app.get('/', function(req, res){ res.send('hello world'); }); // Only works on 3000 regardless of what I set environment port to or how I set // [value] in app.set('port', [value]). // app.listen(3000); app.listen(app.get('port'));
尝试这个
$ PORT=8080 node app.js
在bin/www
,有一行:
var port = normalizePort(process.env.PORT || '3000');
尝试修改它。
在Express框架上更改监听端口的默认方法是修改bin文件夹中名为www的文件。
在那里,你会发现如下所示的一行
var port = normalizePort(process.env.PORT || '3000');
将值3000更改为您希望的任何端口。
这对于Express 4.13.1版本是有效的
只是一个Mac OS X和Linux用户的说明:
如果您想在低于1024的端口号上运行Node / Express应用程序,则必须以超级用户身份运行: sudo PORT=80 node app.js
在使用express-generator(4.13.1)的最新版本的代码中,app.js是一个导出的模块,服务器使用app.set('port',process.env.PORT || 3001)在/ bin / www中启动。在app.js中将被bin / www中的类似语句覆盖。 我刚刚在bin / www中更改了语句。
您find的行只是查找环境variablesPORT
,如果它定义了使用它,否则使用默认端口3000
。 你必须先定义这个环境variables(不需要是root)
export PORT=8080 node <your-app.js>
如果你想显示你在3000上连接的东西
var express = require('express') var app = express() app.get('/', function (req, res) { res.send('Hello World!') }) app.listen(3000, function () { console.log('Example app listening on port 3000!') })
我希望这会对你有所帮助
注意到这个问题没有得到解决……你的机器可能有一个防火墙阻止这些端口,或者iptables被设置为阻止使用这些端口。
尝试在运行应用程序时运行nmap -F localhost(如果没有,请安装nmap)。 如果您在正确的端口上运行应用程序,并且您无法通过远程浏览器访问该应用程序,则会有一些中间件或物理防火墙阻止该端口。
希望这可以帮助!
根据当前版本的快递答复
如果您谈论当前版本的express ,如果您运行app.listen()
开始监听而不指定端口,则Express将为您的应用程序select一个随机端口 ,以了解当前正在使用哪个端口
app.listen(0, () => { console.log(app.address().port) }
应该输出你的app
的端口 。 此外,第一个参数0
可以完全忽略,但不build议使用
确保你从你的应用程序的文件夹中运行package.json。