108

我有一个 Node.js/Express.js 应用程序在我的服务器上运行,它只能在端口 3000 上运行,我正试图找出原因。这是我发现的:

  • 如果不指定端口 ( app.listen()),应用程序会运行,但不会加载网页。
  • 在端口 3001 ( app.listen(3001)) 或任何其他未使用的端口上,应用程序运行但网页不加载。
  • 在端口 2999 上,应用程序会抛出错误,因为其他东西正在使用该端口。
  • 在端口 3000 上,应用程序运行并且网页加载正常。

我知道 Express 应用程序默认使用端口 3000。但奇怪的是,我的应用程序仅在我明确使其在端口 3000 ( app.listen(3000)) 上运行时才运行。

我在第 220 行找到了这个/usr/bin/express

app.set(\'port\', process.env.PORT || 3000);

如前所述:将端口设置为指定的端口,如果未指定,则设置为 3000。

如何让我的应用程序在不同的端口(例如 8080 或 3001)上运行?

谢谢!

编辑:代码示例(非常简单的节点/Express 应用程序)

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);
4

16 回答 16

131

如果您的 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);

此代码意味着将您的端口设置为环境变量PORT,或者如果将undefined其设置为文字3000

或者,使用您的环境设置端口。通过环境设置它用于帮助描述之间PRODUCTION以及DEVELOPMENT许多平台即服务使用环境根据其规范以及内部 Express 配置设置端口。以下设置环境键=值对,然后启动您的应用程序。

$ 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'));
于 2013-08-02T19:29:48.173 回答
34

bin/www中,有一行:

var port = normalizePort(process.env.PORT || '3000');

尝试修改它。

于 2016-04-07T02:28:51.297 回答
14

尝试这个

$ PORT=8080 node app.js
于 2013-08-02T04:09:16.690 回答
13

请参阅此链接。

尝试找到 bin>www 位置并尝试更改端口号...

于 2018-03-24T20:27:12.900 回答
11

在 Express 框架上更改监听端口的默认方法是修改 bin 文件夹中名为 www 的文件。

在那里,您会找到如下所示的一行

var port = normalizePort(process.env.PORT || '3000');

将值 3000 更改为您想要的任何端口。

这对 Express 版本 4.13.1 有效

于 2016-01-17T17:12:47.703 回答
4

给 Mac OS X 和 Linux 用户的注意事项:

如果要在低于 1024 的端口号上运行 Node / Express 应用程序,则必须以超级用户身份运行: sudo PORT=80 node app.js

于 2014-11-10T14:35:39.933 回答
4

在带有 express-generator (4.13.1) 的最新代码版本中,app.js 是一个导出模块,服务器在 /bin/www 中使用 app.set('port', process.env.PORT || 3001) 启动app.js 中的内容将被 bin/www 中的类似语句覆盖。我只是更改了 bin/www 中的语句。

于 2015-09-17T16:47:21.273 回答
2

请注意,这从未解决...您的计算机前面可能有防火墙阻止了这些端口,或者设置了 iptables 以阻止使用这些端口。

运行应用程序时尝试运行 nmap -F localhost(如果没有,请安装 nmap)。如果您似乎在正确的端口上运行应用程序并且您无法通过远程浏览器访问它,那么有一些中间件或物理防火墙阻止了该端口。

希望这可以帮助!

于 2013-10-07T15:16:10.897 回答
2

如果你想展示你在 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!')
})

我希望这对你有帮助

于 2017-01-29T14:23:45.077 回答
2

您找到的行只是查找 environment variable PORT,如果已定义则使用它,否则使用默认 port 3000。你必须先定义这个环境变量(不需要是root)

export PORT=8080
node <your-app.js>
于 2016-08-04T09:12:22.883 回答
2

在 app.js 中,只需添加...

process.env.PORT=2999;

这会将 PORT 变量隔离到 express 应用程序。

于 2018-09-09T02:21:12.213 回答
1

我正在使用minimist包和节点启动参数来控制端口。

node server.js --port 4000

或者

node server.js -p 4000

在 server.js 中,端口可以通过以下方式确定

var argv = parseArgs(process.argv.slice(2))

const port = argv.port || argv.p || 3000;
console.log(`Listening on port ${port}...`)

//....listen(port);

如果没有端口作为参数传递,则默认为 3000。

然后,您可以在port变量上使用监听。

于 2018-06-14T13:01:22.777 回答
1

根据当前版本的快递回答

如果您谈论当前版本的 express,如果您在app.listen()不指定端口的情况下运行开始侦听,Express 将为您的应用程序选择一个随机端口,以了解它当前正在使用哪个端口运行

app.listen(0, () => {
    console.log(app.address().port)
}

应该输出你的端口app。此外,第一个参数0可以完全忽略,但不推荐

于 2017-03-07T18:05:41.287 回答
0

我认为最好的方法是使用dotenv包并在配置文件上设置端口,.env而无需修改文件www夹内的文件bin

只需使用以下命令安装软件包:

npm install dotenv

在您的应用程序中要求它:

require('dotenv').config()

在项目的根目录下创建一个 .env 文件,并在其中添加端口(例如)监听 5000 端口

PORT=5000

就是这样。

更多信息在这里

于 2019-06-13T16:29:49.970 回答
0

确保您从应用程序的那个文件夹运行,其中有 package.json。

于 2017-02-10T10:20:24.610 回答
0

如果您使用的是 Nodemon,我的猜测是在 nodemonConfig 中设置了 PORT 3000。检查是否是这种情况。

于 2019-07-19T14:19:08.950 回答