Node.js / Express.js 앱은 포트 3000에서만 작동합니다.


96

포트 3000에서만 작동하는 내 서버에서 실행되는 Node.js / Express.js 앱이 있는데 그 이유를 알아 내려고합니다. 내가 찾은 내용은 다음과 같습니다.

  • 포트 ( 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과 같은 다른 포트에서 작동하도록하려면 어떻게해야합니까?

감사!

편집 : 코드 샘플 (매우 간단한 노드 / 익스프레스 앱)

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:3000, localhost:3001등? 두 대의 컴퓨터 (클라이언트 한 대와 서버 한 대)를 사용하는 경우 노드가 클라이언트로부터 요청을받을 수 있도록 서버의 방화벽에 예외를 추가해야합니다.
Jonathan Lonowski 2013-08-02

앱을 어떻게 시작하고 있습니까?
deitch

스크럽 / 살균 된 버전을 요점에 올릴 수 있습니까?
deitch

@Jonathan 알아두면 좋습니다 .listen(). 위의 "앱이 실행됩니다"라고 말하면 "애플리케이션을 실행할 때 오류가 없습니다"라고 말하는 것과 같습니다. "웹 페이지가로드되지 않습니다"라고 말하면 "브라우저에서 액세스 할 수 없습니다"라는 말과 동일합니다. 동일한 컴퓨터 (내 서버)에서 모든 액세스. 피드백 감사드립니다.
Benjamin Martin

1
@deitch 사용 중이 $ supervisor app.js거나 $ PORT=[PORT] node app.js환경 포트 변수를 설정하고 싶을 때. 코드 샘플을 올려 보겠습니다.
Benjamin Martin

답변:


118

다음은 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자신의 스펙과 내부 익스프레스 CONFIGS에 따라 포트를 설정하고 또한 서비스로 플랫폼의 많은 환경을 사용합니다. 다음은 환경 키 = 값 쌍을 설정 한 다음 앱을 시작합니다.

$ 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.
Benjamin Martin

@BenjaminMartin Express는 다른 모듈과 같은 모듈이므로 간단한 방법으로 node app.js시작합니다 (개인적으로 nodemon개발 및 테스트에 사용합니다. 여러분이 생각할 수있는 express것은 골격을 구축하는 도우미 프로세스 인 명령 줄 실행 파일입니다. . 파일 구조는 코드의 요지를 게시 할 수 있습니까?
EhevuTov

잡았다. 나는 일반적으로 nodemon와 함께 사용 하여 nohup내 앱을 무기한 실행합니다. 의 CL 실행 가능 버전을 사용하고 있지 않으므로 앱을 express다시 시작할 때마다 다시 시작해야합니다 node. 코드로 편집하려면 내 원본 게시물을 참조하십시오. 감사!
Benjamin Martin

@BenjaminMartin 내 대답의 하단을 확인하고 해당 코드를 실행하십시오. 잘 작동합니다. 방금 내 컴퓨터에서 테스트했습니다.
EhevuTov

이것은 포트를 변경하는 또 다른 유용한 방법이지만 포트가 3000 일 때만 작동합니다. 내 서버에 특정 포트에서만 콘텐츠를 제공 할 수있는 것이 있는지 궁금합니다. 그래도이 구성이 어디에 있는지 모르겠습니다. 이것이 문제가 될 수 있습니까? 참고로 Ubuntu 10.04를 실행하고 있습니다.
Benjamin Martin

31

에는 다음 bin/www과 같은 줄이 있습니다.

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

그것을 수정하십시오.


1
app.js에서 포트 설정을 시도했지만이 줄이 재정의되었습니다. 이것은 포트를 변경하는 올바른 장소입니다.
Neil

12

이 시도

$ PORT=8080 node app.js

1
답변 해 주셔서 감사합니다. app.js 안에 app.listen (3000)이 설정되어있는 경우에만 작동합니다. 즉, 앱을 실행할 때 포트를 설정하면 app.listen ()이 재정의되지 않는 것 같습니다.
Benjamin Martin

완전한. 나는 익스프레스와 함께 사용합니다. PORT = 8000 npm start. 그래서 당신은 당신이 원하는 것을 사용할 수 있습니다 : D.
Johan Hoeksma 2015 년


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 미만의 포트에서 앱을 실행하는 더 나은 옵션은 더 큰 번호의 포트를 전달하는 것입니다. 1024보다 낮은 포트 번호에 액세스 할 수 있도록 sudo를 사용하는 것은 일반적으로 나쁜 습관으로 간주됩니다.
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. 이 환경 변수를 먼저 정의해야합니다 (루트 일 필요 없음).

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

SHOULD의 출력 포트 당신의 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변수에서 수신 대기를 사용할 수 있습니다 .


0

app.js에서 그냥 추가하세요 ...

process.env.PORT=2999;

이렇게하면 PORT 변수가 Express 응용 프로그램에 격리됩니다.


0

가장 좋은 방법은 dotenv 를 사용하는 것입니다 폴더 안의 .env파일을 수정하지 않고 패키지 하고 구성 파일 에 포트를 설정하는 것 입니다.wwwbin

다음 명령으로 패키지를 설치하십시오.

npm install dotenv

응용 프로그램에 필요 :

require('dotenv').config()

프로젝트의 루트 디렉터리에 .env 파일을 만들고 그 안에 포트를 추가 (예 : 포트 5000에서 수신)합니다.

PORT=5000

그리고 그게 다야.

여기에 더 많은 정보


0

Nodemon을 사용하고 있다면 PORT 3000이 nodemonConfig에 설정되어 있다고 생각합니다. 그것이 사실인지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.