繁体   English   中英

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

[英]Node.js/Express.js App Only Works on Port 3000

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

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

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

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

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

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

或者,使用您的环境来设置端口。 通过环境进行设置可以帮助在PRODUCTIONDEVELOPMENT之间进行PRODUCTION ,并且许多平台即服务也可以使用环境根据其规格以及内部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'));

bin/www ,有一行:

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

尝试对其进行修改。

尝试这个

$ PORT=8080 node app.js

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

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

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

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

这对于Express版本4.13.1有效

请参考此链接。

尝试找到bin> www位置,然后尝试更改端口号...

给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中的语句。

找到的行仅查找环境变量PORT ,如果已定义则使用它,否则使用默认端口3000 您必须先定义此环境变量(无需是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会为您的应用程序选择一个随机端口 ,以了解其当前正在使用哪个端口

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

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

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

process.env.PORT=2999;

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

确保从应用程序的该文件夹中运行,其中包含package.json。

我正在使用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。

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

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

npm install dotenv

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

require('dotenv').config()

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

PORT=5000

就是这样。

更多信息在这里

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

今天我对一本书样本的测试运行找到了一种在将端口号从8000更改为8002以启动服务器后运行客户端的方法: http://localhost:8002 failed http://localhost:8002/index works

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM