নোডজেএস: সার্ভারের বন্দরটি কীভাবে পাবেন?


142

আপনি প্রায়শই নোডের উদাহরণ হ্যালো ওয়ার্ল্ড কোড দেখতে পান যা একটি এইচটিপি সার্ভার তৈরি করে, একটি বন্দরে শুনতে শুরু করে, তারপরে কিছু অনুসরণ করে:

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 উত্তর প্রকাশ করুন:

এক্সপ্রেস x.x (নীচে প্রতি টিয়েন ডু এর জবাব), এখন অ্যাপ.লিসটেন () কে একটি অ্যাসিনক্রোনাস অপারেশন হিসাবে বিবেচনা করে, তাই শ্রোতা.এড্রেস () কেবল অ্যাপ্লিকেশন () এর কলব্যাকের অভ্যন্তরে ডেটা ফেরত পাঠাবে:

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().portapp.listen()
আন্দ্রে স্টালবে

এক্সপ্রেস ৫.x এ দেখতে কেমন?
ডায়োজিনেস

2
আপনি মিডলওয়্যারের যে কোনও জায়গায় বন্দরটি পেতে পারেন: req.sket.address ()। বন্দর
jlguenego

@ অ্যান্ড্রেইস্টালবে যা বলেছিল তা কেবল যুক্ত করতে, আপনি ব্যবহার করতে পারেন this.address.port()তবে আপনি এটি কোনও তীর ফাংশনের অভ্যন্তরে ব্যবহার করতে পারবেন না। আপনার পুরানো স্কুলটি করতে হবে app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(হ্যাঁ, আমি জানি ব্যাকটিকগুলি ভাল, তবে আমি ওভারফ্লো মন্তব্যগুলিতে স্ট্যাক করতে পারি না)
ওয়ার্মসএস

65

এক্সপ্রেস v3.0 এ,

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

আর কাজ করে না! এক্সপ্রেস ভি ৩.০ এর জন্য আপনার এইভাবে একটি অ্যাপ এবং একটি সার্ভার তৈরি করা উচিত:

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 এ দৃশ্যমান


অথবা আপনি কেবল সার্ভার তৈরির পুরানো পদ্ধতিটি ব্যবহার করতে পারেন যা এখনও কাজ করে। কেবল মনে হচ্ছে পোর্ট আফটারওয়ার্ডটি অ্যাক্সেস করার কোনও উপায় নেই। তবে, যেহেতু আপনি সার্ভার.লস্টেনের কলটিতে নিজেকে পোর্টটি নির্দিষ্ট করছেন, তাই সার্ভার.এড্রেস ()। বন্দরটি ব্যবহার করার দরকার নেই, যেহেতু আপনি ঠিক একই মানটি ব্যবহার করতে পারেন যা আপনি সার্ভার.লাস্টেনে পাস করেছেন।
মেরি হামলিন

(যদিও আমি সবেমাত্র মাইগ্রেশন গাইডটি পড়েছি এবং দেখতে পাচ্ছি যে আপনি উপরে উল্লিখিত একটি অ্যাপ্লিকেশন এবং সার্ভার তৈরি করার পদ্ধতিটি আসলেই নতুন পছন্দসই পদ্ধতি
Mary

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

HT মডিউলটির প্রয়োজন কখনও ছিল না।

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

সর্বশেষ নোড.জেএস (v0.3.8-প্রাক) সহ: আমি ডকুমেন্টেশন চেক করেছি, পরিদর্শন করেছি সার্ভারের দৃষ্টান্তটি http.createServer () দ্বারা ফিরে এসে সার্ভার.লাস্টেন () এর উত্স কোডটি পড়েছি ...

দুঃখের বিষয়, বন্দরটি কেবলমাত্র স্থানীয় ভেরিয়েবল হিসাবে অস্থায়ীভাবে সংরক্ষণ করা হয় এবং প্রসেস.বাইন্ডিং ('নেট')। বাইন্ড () যা একটি দেশীয় পদ্ধতি is আমি আর তাকালাম না।

দেখে মনে হচ্ছে যে আপনি সার্ভার.লাস্টেন () সরবরাহ করেছেন পোর্ট মানটির রেফারেন্স রাখার চেয়ে ভাল আর কোনও উপায় নেই।


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
তবে কেন জানি না সার্ভার.এড্রেস ()। ঠিকানাটি সর্বদা আমার স্থানীয় বিকাশ মেশিনে (ওএসএক্স) থাকে 0.0.0.0।
টিয়েন ডু

এটি গ্রহণযোগ্য উত্তরে যুক্ত করা উচিত যেহেতু এক্সপ্রেস 4.0.০ এখন আর অ্যাপ্লিকেশন () কে সিঙ্ক্রোনাস অপারেশন হিসাবে বিবেচনা করে না এবং আপনাকে এখনই কলব্যাকে শ্রোতা.এড্রেস () চালানো দরকার।
রাভেনহর্সট

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

এফওয়াইআই, প্রতিবার এটি একটি ভিন্ন বন্দরে চলবে।



-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.