NodeJS: सर्वर का पोर्ट कैसे प्राप्त करें?


142

आप अक्सर नोड के लिए उदाहरण हेल्लो वर्ल्ड कोड देखते हैं जो एक Http सर्वर बनाता है, एक पोर्ट पर सुनना शुरू करता है, उसके बाद कुछ लाइनों के साथ:

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

लेकिन इसके बजाय आदर्श रूप से आप यही चाहते हैं:

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

मैं उस पोर्ट को कैसे पुनः प्राप्त करूं जो सर्वर वर्तमान में कॉल करने से पहले एक चर में संख्या को संग्रहीत किए बिना सुन रहा है server.listen()?

मैंने इसे पहले भी देखा है, लेकिन मैं इसे नोड डॉक्यूमेंटेशन में नहीं ढूंढ सकता। शायद यह व्यक्त करने के लिए कुछ विशिष्ट है?


3
में खोजेंreq.headers.host
एंड्रयू_ 1510

जवाबों:


161

एक्सप्रेस 4.x उत्तर:

एक्सप्रेस 4.x (नीचे टीएन डू के उत्तर के अनुसार), अब 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
});

एक्सप्रेस 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
धन्यवाद, मुझे लगता है कि मैं वास्तव में क्या देख रहा हूँ। जैसे ही मुझे इसका परीक्षण करने का मौका मिलेगा, मैं इसे स्वीकार कर लूंगा। चीयर्स।
डेविड तांग

4
और अगर आप उस चर को नहीं चाहते हैं तो var listenerआप कॉलबैक के this.address().portअंदर उपयोग कर सकते हैंapp.listen()
आंद्रेई स्टालबे

यह एक्सप्रेस 5.x में कैसा दिखता है?
डायोजनीज

2
आप एक मिडलवेयर में कहीं भी पोर्ट प्राप्त कर सकते हैं: req.socket.address ()। port
jlguenego

सिर्फ @AndreiStalbe ने जो कहा, उस पर जोड़ने के लिए, आप उपयोग कर सकते हैं, this.address.port()लेकिन आप एक तीर फ़ंक्शन के अंदर उसका उपयोग नहीं कर सकते। आपको पुराना स्कूल करने की आवश्यकता होगी app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(हां, मुझे पता है कि बैकटिक्स अच्छे हैं, लेकिन मैं उन्हें स्टैक ओवरफ्लो टिप्पणियों में नहीं कर सकता)
WORMSS

65

एक्सप्रेस v3.0 में,

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

अब काम नहीं करता है! एक्सप्रेस 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);

मैं खुद इस मुद्दे पर भागा और नए वाक्यविन्यास का दस्तावेजीकरण करना चाहता था। एक्सप्रेस v3.0 में यह और अन्य परिवर्तन https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x पर दिखाई दे रहे हैं


या आप सर्वर बनाने की पुरानी पद्धति का उपयोग कर सकते हैं, जो अभी भी काम करता है। लगता है कि अब पोर्ट के बाद पहुंचने का कोई रास्ता नहीं है। हालाँकि, जब से आप अपने आप को कॉल में server.listen में पोर्ट निर्दिष्ट कर रहे हैं, वास्तव में server.address () पोर्ट का उपयोग करने की आवश्यकता नहीं है, क्योंकि आप केवल उसी मान का उपयोग कर सकते हैं जो आपने server.listen में दिया था।
मैरी हैमलिन

(हालांकि मैंने सिर्फ माइग्रेशन गाइड को पढ़ा और देखा कि ऐप और सर्वर बनाने के लिए जो विधि आपने ऊपर बताई है, वह वास्तव में नया पसंदीदा तरीका है।)
मैरी हैमलिन

3
@ मैरिअल हैमलिन: यदि आप पास 0हो रहे हैं तो यह उस स्थिति में उपयोगी है, जब server.listen()किसी रैंडम पोर्ट नंबर को असाइन किया गया हो। यदि आप एक सर्वर पर कई एक्सप्रेस ऐप चला रहे हैं और आप मैन्युअल रूप से पोर्ट नंबर असाइन नहीं करना चाहते हैं तो आप ऐसा कर सकते हैं।
नैट

app.listen()http सर्वर उदाहरण भी देता है।
वक्री

23

वर्तमान संस्करण (v0.5.0-पूर्व) में पोर्ट सर्वर ऑब्जेक्ट पर एक संपत्ति के रूप में उपलब्ध प्रतीत होता है, 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

यदि आप एक्सप्रेस का उपयोग कर रहे हैं, तो आप इसे अनुरोध ऑब्जेक्ट से प्राप्त कर सकते हैं:

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

14

मैं इस तरह से एक्सप्रेस 4 का उपयोग करता हूं:

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

इसका उपयोग करके मुझे श्रोता / सर्वर के लिए एक अलग चर का उपयोग करने की आवश्यकता नहीं है।


1
अब तक का सबसे अच्छा जवाब! यदि आप ES6 का उपयोग कर रहे हैं, तो तीर-कार्यों का उपयोग न करें। thisअपरिभाषित हो जाएगा।
लक्ष्मण

9

Http मॉड्यूल की आवश्यकता कभी भी आवश्यक नहीं थी।

httpएक्सप्रेस 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

दोबारा, यह एक्सप्रेस 3.5.1 और 4.0.0 में परीक्षण किया गया है। आयात करना httpकभी आवश्यक नहीं था। सुनने का तरीका एक http सर्वर ऑब्जेक्ट देता है। https://github.com/visionmedia/express/blob/master/lib/application.js#L531


6

नवीनतम node.js (v0.3.8-पूर्व) के साथ: मैंने दस्तावेज़ीकरण की जाँच की, http.createServer () द्वारा लौटाए गए सर्वर उदाहरण का निरीक्षण किया, और server.listen () का स्रोत कोड पढ़ा ...

अफसोस की बात है कि बंदरगाह को केवल स्थानीय चर के रूप में अस्थायी रूप से संग्रहीत किया जाता है और एक कॉल में एक तर्क के रूप में समाप्त होता है प्रक्रिया के लिए। बाइंडिंग ('नेट')। बाइंड () जो एक मूल विधि है। मैंने आगे नहीं देखा।

ऐसा लगता है कि आपके द्वारा server.listen () को प्रदान किए गए पोर्ट मान का संदर्भ रखने से बेहतर कोई तरीका नहीं है।


1
अनुसंधान के लिए +1 और धन्यवाद। मैं अल्फ्रेड के जवाब को स्वीकार कर रहा हूं क्योंकि उसने वह सही चीज ढूंढ ली है जिसकी मुझे तलाश थी, लेकिन मुझे खुशी है कि मुझे पता है कि यह अब नोड कोर में नहीं है।
डेविड तांग

5

पुरानी शैली से नई (एक्सप्रेस 3.x) शैली में बदलने का सबसे सरल तरीका इस प्रकार है:

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

3.x यह इस तरह काम करता है:

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


3

मैं खुद से भी यह सवाल पूछ रहा था, फिर मैं इस नमूने को देखने के लिए एक्सप्रेस 4.x गाइड पेज आया :

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

2
लेकिन मुझे नहीं पता कि क्यों server.address () पता मेरे स्थानीय विकास मशीन (OSX) पर हमेशा 0.0.0.0 है।
Tien Do

यह स्वीकार्य उत्तर में जोड़ा जाना चाहिए क्योंकि एक्सप्रेस 4.0 अब एक तुल्यकालिक ऑपरेशन के रूप में app.listen () का इलाज नहीं करता है और आपको कॉलबैक में श्रोता.ड्रेस () को चलाने की आवश्यकता है।
रेवेनहर्ट्स

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 पर एक्सप्रेस सर्वर सुन रहा है


2

यदि आपने पोर्ट नंबर को परिभाषित नहीं किया है और आप जानना चाहते हैं कि यह किस पोर्ट पर चल रहा है।

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

FYI करें, हर बार यह एक अलग पोर्ट में चलेगा।



-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'), जो आपको प्रोटोकॉल, सब डोमेन, डोमेन और पोर्ट देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.