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

或者,使用您的环境设置端口。 通过环境进行设置用于帮助描绘PRODUCTIONDEVELOPMENT之间的关系,并且许多平台即服务使用环境根据其规格和内部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。