NodeJS : 서버 포트를 얻는 방법?


142

Http Server를 생성하고 포트에서 청취를 시작한 다음 다음 행을 따라가는 Node의 hello world code 예제가 종종 표시됩니다.

console.log('Server is listening on port 8000');

그러나 이상적으로는 이것을 원할 것입니다.

console.log('Server is listening on port ' + server.port);

호출하기 전에 변수에 숫자를 저장하지 않고 서버가 현재 수신 대기중인 포트를 어떻게 검색 server.listen()합니까?

이전에이 작업을 수행했지만 노드 설명서에서 찾을 수 없습니다. 어쩌면 표현하기에 특정한 것일까 요?


3
찾기req.headers.host
Andrew_1510

답변:


161

Express 4.x 답변 :

Express 4.x (아래 Tien Do의 답변에 따라)는 이제 app.listen ()을 비동기 작업으로 처리하므로 listener.address ()는 app.listen ()의 콜백 내에서만 데이터를 반환합니다.

var app = require('express')();

var listener = app.listen(8888, function(){
    console.log('Listening on port ' + listener.address().port); //Listening on port 8888
});

Express 3 답변 :

나는 당신이 이것을 찾고 있다고 생각합니다 (표현식?) :

console.log("Express server listening on port %d", app.address().port)

express명령 에서 디렉토리 구조를 만들 때이 (아래 줄)를 보았을 것입니다 .

alfred@alfred-laptop:~/node$ express test4
   create : test4
   create : test4/app.js
   create : test4/public/images
   create : test4/public/javascripts
   create : test4/logs
   create : test4/pids
   create : test4/public/stylesheets
   create : test4/public/stylesheets/style.less
   create : test4/views/partials
   create : test4/views/layout.jade
   create : test4/views/index.jade
   create : test4/test
   create : test4/test/app.test.js
alfred@alfred-laptop:~/node$ cat test4/app.js 

/**
 * Module dependencies.
 */

var express = require('express');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.use(express.bodyDecoder());
  app.use(express.methodOverride());
  app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
  app.use(app.router);
  app.use(express.staticProvider(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

// Routes

app.get('/', function(req, res){
  res.render('index.jade', {
    locals: {
        title: 'Express'
    }
  });
});

// Only listen on $ node app.js

if (!module.parent) {
  app.listen(3000);
  console.log("Express server listening on port %d", app.address().port)
}

1
고마워, 나는 그것이 내가 찾고있는 정확하게라고 생각합니다. 테스트 할 기회가 생기면 바로 수락하겠습니다. 건배.
David Tang

4
그리고 그 변수 var listener를 원하지 않는다면 콜백 this.address().port안에서 사용할 수 있습니다app.listen()
Andrei Stalbe

Express 5.x에서는 어떤 모양입니까?
디오게네스

2
미들웨어 어느 곳에서나 포트를 얻을 수 있습니다 : req.socket.address (). port
jlguenego

@AndreiStalbe가 말한 것에 덧붙여서 사용할 수는 this.address.port()있지만 화살표 함수 내에서는 사용할 수 없습니다. 당신은 구식 학교를해야합니다 app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(예, 백틱이 더
좋다는

65

Express v3.0에서는

/* No longer valid */
var app = express.createServer();
app.listen();
console.log('Server running on %s', app.address().port);

더 이상 작동하지 않습니다! Express v3.0의 경우 다음과 같은 방법으로 앱과 서버를 작성해야합니다.

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

app.get('/', function(req, res) {
    res.send("Hello World!");
});

server.listen(3000);
console.log('Express server started on port %s', server.address().port);

나는이 문제에 스스로 뛰어 들었고 새로운 구문을 문서화하고 싶었다. Express v3.0의이 변경 사항 및 기타 변경 사항은 https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x 에서 볼 수 있습니다.


또는 서버를 만드는 오래된 방법을 사용하면 여전히 작동합니다. 더 이상 포트 후문에 액세스 할 수있는 방법이없는 것 같습니다. 그러나 server.listen을 호출 할 때 포트를 직접 지정하므로 server.listen에 전달한 것과 동일한 값만 사용할 수 있으므로 server.address (). port를 사용할 필요가 없습니다.
Mary Hamlin

(마지막으로 마이그레이션 가이드를 읽고 위에서 언급 한 앱과 서버를 만드는 방법이 실제로 선호되는 새로운 방법이라는 것을 알았습니다.)
Mary Hamlin

3
@MaryHamlin : 당신이 통과하는 경우에 유용 0할 수 server.listen()있으며,이 경우에 임의의 포트 번호가 할당됩니다. 한 서버에서 여러 Express 앱을 실행하고 있고 포트 번호를 수동으로 할당하지 않으려는 경우이 작업을 수행 할 수 있습니다.
Nate

app.listen()http 서버 인스턴스도 반환합니다.
Vicary

23

현재 버전 (v0.5.0-pre)에서 포트는 서버 객체의 속성으로 사용 가능한 것으로 보입니다 ( http://nodejs.org/docs/v0.4.7/api/net.html#server.address 참조).

var server = http.createServer(function(req, res) {
    ...
}

server.listen(8088);
console.log(server.address());
console.log(server.address().address);
console.log(server.address().port);

출력

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088

22

요청 처리시 포트가 필요하고 앱을 사용할 수없는 경우 다음을 사용할 수 있습니다.

request.socket.localPort

17

express를 사용하는 경우 요청 객체에서 얻을 수 있습니다.

req.app.settings.port // => 8080 or whatever your app is listening at.

14

이 방법으로 Express 4를 사용합니다.

app.listen(1337, function(){
  console.log('Express listening on port', this.address().port);
});

이것을 사용하면 리스너 / 서버에 별도의 변수를 사용할 필요가 없습니다.


1
지금까지 가장 좋은 답변! ES6를 사용하는 경우 화살표 기능을 사용하지 마십시오. this정의되지 않습니다.
Laxmana

9

http 모듈이 필요하지 않았습니다.

httpExpress 3 또는 4에서는 추가 가져 오기 가 필요하지 않습니다 listen(). 결과를 지정하면 충분합니다.

var server = require('express')();

server.get('/', function(req, res) {
  res.send("Hello Foo!");
});

var listener = server.listen(3000);
console.log('Your friendly Express server, listening on port %s', listener.address().port);
// Your friendly Express server, listening on port 3000

다시 Express 3.5.1 및 4.0.0에서 테스트되었습니다. 가져 오기 http가 필요하지 않았습니다. listen 메소드는 http 서버 객체를 반환합니다. https://github.com/visionmedia/express/blob/master/lib/application.js#L531


6

최신 node.js (v0.3.8-pre) : 설명서를 확인하고 http.createServer ()에서 반환 한 서버 인스턴스를 검사하고 server.listen ()의 소스 코드를 읽었습니다 ...

안타깝게도 포트는 일시적으로 로컬 변수로 저장되며 기본 메소드 인 process.binding ( 'net'). bind () 호출에서 인수로 끝납니다. 나는 더 이상 보지 않았다.

server.listen ()에 제공 한 포트 값에 대한 참조를 유지하는 것보다 더 좋은 방법은없는 것 같습니다.


1
+1하고 연구 해 주셔서 감사합니다. 알프레드가 내가 찾던 정확한 것을 찾았 기 때문에 Alfred의 대답을 받아들이고 있지만 지금은 노드 코어에 없다는 것을 알게되어 기쁩니다.
David Tang

5

이전 스타일에서 새로운 스타일 (Express 3.x) 스타일로 변환하는 가장 간단한 방법은 다음과 같습니다.

var server = app.listen(8080);
console.log('Listening on port: ' + server.address().port);

Pre 3.x는 다음과 같이 작동합니다.

/* This no longer works */
app.listen(8080);
console.log('Listening on port: ' + app.address().port);


3

나 자신 도이 질문을하고 있었고, 이 샘플을보기 위해 Express 4.x 가이드 페이지 가 나왔습니다 .

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});

2
그러나 왜 로컬 개발 시스템 (OSX)에서 server.address (). address가 항상 0.0.0.0인지 모르겠습니다.
Tien Do

Express 4.0에서는 더 이상 app.listen ()을 동기 작업으로 처리하지 않으므로 콜백에서 listener.address ()를 실행해야하므로 허용되는 답변에 추가해야합니다.
RavenHursT

3

server.address().port 아래 코드와 같이 포트 번호를 얻을 수 있습니다 .

var http = require('http');
var serverFunction = function (req, res) {

    if (req.url == '/') {
        console.log('get method');
        res.writeHead(200, { 'content-type': 'text/plain' });
        res.end('Hello World');
    }

}
var server = http.createServer(serverFunction);
server.listen(3002, function () {
    console.log('server is listening on port:', server.address().port);
});

3
var express = require('express');    
var app = express();
    app.set('port', Config.port || 8881);
    var server = app.listen(app.get('port'), function() {
        console.log('Express server listening on port ' + server.address().port); 
    });

포트 8881에서 Express 서버 청취


2

포트 번호를 정의하지 않았으며 포트 번호를 실행하려는 경우

let http = require('http');
let _http = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello..!')
}).listen();
console.log(_http.address().port);

참고로, 다른 포트에서 실행될 때마다.



-1

간단한 http 서버와 청취 포트를 얻는 방법

var http = require("http");
             function onRequest(request, response) {
               console.log("Request received.");
               response.writeHead(200, {"Content-Type": "text/plain"});
               response.write("Hello World");
               response.end();
             }

             var server =http.createServer(onRequest).listen(process.env.PORT, function(){
            console.log('Listening on port '); //Listening on port 8888
        });

그런 다음 다음을 사용하여 서버 포트를 가져옵니다.

console.log('Express server started on port %s', server.address().port);

-1
const express = require('express');                                                                                                                           
const morgan = require('morgan')
const PORT = 3000;

morgan.token('port', (req) => { 
    return req.app.locals.port; 
});

const app = express();
app.locals.port = PORT;
app.use(morgan(':method :url :port'))
app.get('/app', function(req, res) {
    res.send("Hello world from server");
});

app1.listen(PORT);

-2

더 쉬운 방법은을 호출 app.get('url')하는 것입니다. 프로토콜, 하위 도메인, 도메인 및 포트를 제공합니다.

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