我有一个 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)上运行?
谢谢!
编辑:代码示例(非常简单的节点/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);
.listen()
需要 port
,因此您不应尝试不使用。 2) 运行应用程序时是否遇到任何错误?或者只是浏览器似乎无法访问它? 3) 您是否尝试与 localhost:3000
、localhost:3001
等在同一台机器上访问该网站?如果您使用两台机器,一台客户端和一台服务器,则需要在服务器上的防火墙中添加例外,以允许 Node 接收来自客户端的请求。
.listen()
。上面当我说“应用程序运行”时,这与您说的“运行应用程序时没有错误”相同。当我说“网页无法加载”时,这与您说的“无法从浏览器访问”相同。所有访问都来自同一台机器(我的服务器)。感谢您的反馈。
$ supervisor app.js
或 $ PORT=[PORT] 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
,或者如果是 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'));
在 bin/www
中有一行:
var port = normalizePort(process.env.PORT || '3000');
尝试修改它。
尝试这个
$ PORT=8080 node app.js
https://i.stack.imgur.com/oEtEf.png
尝试找到 bin>www 位置并尝试更改端口号...
在 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 是一个导出模块,服务器在 /bin/www 中使用 app.set('port', process.env.PORT || 3001) 启动app.js 中的内容将被 bin/www 中的类似语句覆盖。我只是更改了 bin/www 中的语句。
请注意,这从未解决...您的计算机前面可能有防火墙阻止了这些端口,或者设置了 iptables 以阻止使用这些端口。
运行应用程序时尝试运行 nmap -F localhost(如果没有,请安装 nmap)。如果您似乎在正确的端口上运行应用程序并且您无法通过远程浏览器访问它,那么有一些中间件或物理防火墙阻止了该端口。
希望这可以帮助!
您找到的行仅查找环境变量 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!')
})
我希望这对你有帮助
根据当前版本的快递回答
如果您谈论 当前版本的 express,如果您运行 app.listen()
开始侦听而不指定端口, Express 将为您的应用程序选择一个随机端口,以了解它当前正在使用哪个端口
app.listen(0, () => {
console.log(app.address().port)
}
应该输出您的app
的端口。此外,第一个参数 0
可以完全忽略,但不推荐
在 app.js 中,只需添加...
process.env.PORT=2999;
这会将 PORT 变量隔离到 express 应用程序。
我正在使用 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。
-p
对我不起作用。但双连字符 --p
有效。感谢您的回答。
确保您从应用程序的那个文件夹运行,其中有 package.json。
如果您使用的是 Nodemon,我的猜测是在 nodemonConfig 中设置了 PORT 3000。检查是否是这种情况。
不定期副业成功案例分享
app.set()
代码放入我的应用程序并将 3000 更改为 8080。仍然仅适用于app.listen(3000)
。 2.运行node app时,将环境端口变量改为8080。仍然只适用于app.listen(3000)
。 3. 转到 /usr/bin/express(第 220 行)并将 3000 更改为 8080。仍然只适用于app.listen(3000)
。不过,感谢您提供信息丰富的帖子。有什么我需要重新启动的吗?据我所知,Express 无法重新启动,并且每次使用node app.js.
时都会重新启动 Node 应用程序node app.js
即可启动它(我个人在开发和测试时使用nodemon
。您可能会想到的是express
命令行可执行文件是一个帮助程序构建你的骨架文件结构。你能发布你的代码的要点吗?nodemon
与nohup
结合使用以使我的应用程序无限期地运行。我没有使用express
的 CL 可执行版本,因此每次我重新启动我的node
应用程序时它都必须重新启动。请参阅我的原始帖子以进行代码编辑。谢谢!