Javascript Node.js/Express.js应用程序仅适用于端口3000

Javascript Node.js/Express.js应用程序仅适用于端口3000,javascript,node.js,configuration,express,port,Javascript,Node.js,Configuration,Express,Port,我有一个Node.js/Express.js应用程序在我的服务器上运行,它只在端口3000上运行,我正在试图找出原因。以下是我的发现: 如果不指定端口(app.listen()),应用程序将运行,但网页不会加载 在端口3001(app.listen(3001))或任何其他未使用的端口上,应用程序运行,但网页不加载 在端口2999上,应用程序抛出一个错误,因为有其他东西正在使用该端口 在端口3000上,应用程序运行,网页加载正常 我知道Express应用程序默认为端口3000。但奇怪的是,我的

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

  • 如果不指定端口(
    app.listen()
    ),应用程序将运行,但网页不会加载
  • 在端口3001(
    app.listen(3001)
    )或任何其他未使用的端口上,应用程序运行,但网页不加载
  • 在端口2999上,应用程序抛出一个错误,因为有其他东西正在使用该端口
  • 在端口3000上,应用程序运行,网页加载正常
我知道Express应用程序默认为端口3000。但奇怪的是,我的应用程序只有在我明确让它在端口3000上运行时才会运行(
app.listen(3000)

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

app.set(\'port\', process.env.PORT || 3000);
如前所述:将端口设置为指定的端口,如果未指定任何端口,则设置为3000

如何使我的应用程序在不同的端口(如8080或3001)上工作

谢谢

编辑:代码示例(非常简单的节点/快速应用)

试试这个

$ PORT=8080 node app.js

如果您的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
,或者如果该变量
未定义
,则将其设置为文本
3000

或者,使用您的环境设置端口。通过环境设置端口用于帮助划分
生产
开发
之间的界限,许多平台作为一种服务使用环境根据其规格以及内部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'));

注意到这个问题一直没有解决。。。您的计算机前面可能有防火墙阻止这些端口,或者设置了iptables以阻止使用这些端口

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


希望这有帮助

请注意Mac OS X和Linux用户:

如果要在低于1024的端口号上运行Node/Express应用程序,则必须以超级用户身份运行:
在最新版本的带有express generator(4.13.1)的代码中,
sudo PORT=80节点app.js

app.js是一个导出模块,服务器在/bin/www中使用app.js中的app.set('PORT',process.env.PORT | 3001)启动,将被bin/www中的类似语句覆盖。
我刚刚更改了bin/www中的语句。

在Express framework上更改侦听端口的默认方法是修改bin文件夹中名为www的文件

在这里,您将发现一行如下所示

var port = normalizePort(process.env.PORT || '3000');
将值3000更改为所需的任何端口


这对Express版本4.13.1有效,在
bin/www
中有一行:

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

尝试修改它。

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

导出端口=8080
节点

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

我希望这将对您有所帮助

确保您是从应用程序的文件夹运行的,在那里您有package.json。

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

app.listen(0, () => {
    console.log(app.address().port)
}
应该输出
应用程序的端口。此外,可以完全忽略第一个参数
0
,但不建议使用


尝试定位bin>www位置并尝试更改端口号…

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

node server.js——端口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


然后,您可以在
端口上使用listen
变量。

在app.js中,只需添加

process.env.PORT=2999;

这将把端口变量隔离到express应用程序。

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

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

npm安装dotenv
在您的应用程序中需要它:

require('dotenv').config()
在项目的根目录中创建一个.env文件,并在其中添加端口(例如)以侦听端口5000

PORT=5000
就这样


更多信息

如果您使用的是Nodemon,我猜端口3000是在nodemonConfig中设置的。
检查情况是否如此。

谢谢你的回答-只有在app.js中设置了app.listen(3000)时,这才有效。换句话说,当我像您一样运行应用程序时设置端口似乎不会覆盖app.listen().Perfect。我使用的是express:PORT=8000 npm启动。因此,您可以使用任何您想要的:D.1)需要
端口,因此您不应该尝试不使用。2) 运行应用程序时是否出现任何错误?或者它只是看起来无法从浏览器访问?3) 您是否正在尝试使用
localhost:300访问同一台计算机上的网站
require('dotenv').config()
PORT=5000