Node.js / Express.js应用仅在端口3000上运行


96

我在服务器上运行了一个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);

1)A port是必填项.listen(),因此您不应该尝试没有。2)在运行应用程序时遇到任何错误?还是从浏览器看来无法访问?3)您试图访问的网站在同一台机器上localhost:3000localhost:3001等?如果使用的是两台机器,一台客户端和一台服务器,则需要向服务器上的防火墙添加例外,以允许Node接收来自客户端的请求。
Jonathan Lonowski

您如何启动该应用程序?
deitch

您是否有可能将经过清理/消毒的版本记入要点?
deitch

@Jonathan很高兴知道.listen()。在上面我说“该应用程序正在运行”时,这与您所说的“在运行该应用程序时没有错误”相同。当我说“网页无法加载”时,这与您说“无法从浏览器访问”相同。所有访问都来自同一台机器(我的服务器)。感谢您的反馈。
本杰明·马丁

1
我正在使用@deitch $ supervisor app.js$ PORT=[PORT] node app.js想设置环境端口变量时。我将提供一个代码示例。
本杰明·马丁

Answers:


117

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

2
这真的很奇怪。我已完成以下操作:1.将app.set()代码放入我的应用程序中,并将3000更改为8080。仍然仅适用于app.listen(3000)。2.运行节点应用程序时,将环境端口变量更改为8080。仍仅适用于app.listen(3000)。3.转到/ usr / bin / express(第220行),并将3000更改为8080。仍然仅适用于app.listen(3000)。不过,谢谢您提供的信息丰富。我需要重启吗?无法使用我能说的方式重新启动Express,每次使用时都会重新启动Node应用程序node app.js.
本杰明·马丁

@BenjaminMartin Express与其他模块一样,都是一个模块,因此只需一个简单的即可node app.js启动(我nodemon在开发和测试时亲自使用。您可能会想到的是express命令行可执行文件,它是构建您骨骼的帮助程序。文件结构。您可以张贴代码要点吗?
EhevuTov 2013年

知道了。我通常只nodemon与结合使用nohup以使我的应用程序无限期运行。我没有使用CL的CL可执行版本,express因此每次我重新启动node应用程序时都必须重新启动它。请参阅我的原始帖子以获取对代码的修改。谢谢!
本杰明·马丁

@BenjaminMartin检查我的答案的底部并运行该代码。那应该很好。我只是在我的机器上测试过。
EhevuTov

这是更改端口的另一种有用的方法,但它仅在端口为3000时才有效。我开始怀疑服务器上是否有某些内容仅允许在某些端口上提供内容。我不知道此配置将位于何处。这可能是个问题吗?仅供参考,我正在运行Ubuntu 10.04。
本杰明·马丁

31

在中bin/www,有一行:

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

尝试对其进行修改。


1
我尝试在app.js中设置端口,但此行被覆盖。这是更改端口的正确位置。
尼尔,

12

试试这个

$ PORT=8080 node app.js

1
感谢您的回答-仅当我在app.js中设置了app.listen(3000)时,此方法才有效。换句话说,在您运行应用程序时设置端口似乎并不会覆盖app.listen()。
本杰明·马丁

完善。我用的是快递:PORT = 8000 npm start。因此,您可以使用任何您想要的:D。
Johan Hoeksma


9

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

在那里,您会发现如下一行

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

将值3000更改为所需的任何端口。

这对于Express版本4.13.1有效


4

给Mac OS X和Linux用户一个提示:

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


2
在1024以下的端口上运行应用程序的更好选择是转发数量更大的端口。通常,使用sudo能够访问小于1024的端口号是一种不好的做法。
Pieter VDE

4

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


2

注意,此问题从未解决过……您的机器前可能有防火墙阻止了这些端口,或者设置了iptables以阻止使用这些端口。

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

希望这可以帮助!


那对我有用。忘记允许端口。
lalilulelost

2

您找到的行仅查找环境变量PORT,如果已定义,则使用该变量,否则使用默认端口3000。您必须先定义此环境变量(无需是root)

export PORT=8080
node <your-app.js>

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!')
})

希望对您有帮助


1

根据快递的当前版本回答

如果您谈论的是Express当前版本,如果您运行app.listen()时未指定端口就开始监听,那么Express会为您的应用程序选择一个随机端口,以了解其当前正在使用哪个端口

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

应该输出您的端口app。此外,第一个参数0可以完全忽略,但不建议使用



0

我正在使用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变量上使用listen 。


0

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

process.env.PORT=2999;

这会将PORT变量隔离到快速应用程序中。


0

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

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

npm install dotenv

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

require('dotenv').config()

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

PORT=5000

就是这样。

更多信息在这里


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.