javascript - شرح - express vpn




NodeJS: كيفية الحصول على منفذ الخادم؟ (12)

أدناه خادم 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);

غالبًا ما تشاهد مثالًا على رمز الترميز العالمي للعقدة التي تنشئ خادم Http ، وتبدأ بالاستماع على منفذ ، ثم يتبعها شيء على غرار:

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

ولكن من الناحية المثالية ، فإنك تريد ذلك بدلاً من ذلك:

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

كيف يمكنني استرداد المنفذ الذي يستمع إليه الخادم حاليًا دون تخزين الرقم في متغير قبل استدعاء server.listen() ؟

لقد رأيت ذلك من قبل لكنني لا أستطيع العثور عليه في وثائق العقد. ربما شيء محدد للتعبير؟


إذا كنت تستخدم Express ، فيمكنك الحصول عليها من كائن الطلب:

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

استخدم هذه الطريقة Express 4:

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

باستخدام هذا لست بحاجة إلى استخدام متغير منفصل للمستمع / الخادم.


الطريقة الأسهل هي فقط للاتصال بـ app.get('url') ، الذي يمنحك البروتوكول ، والمجال الفرعي ، والمجال ، والمنفذ.


في التعبير السريع 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


في حالة ما إذا كنت بحاجة إلى منفذ في وقت معالجة الطلب والتطبيق غير متاح ، يمكنك استخدام هذا:

request.socket.localPort

مع أحدث node.js (v0.3.8 - قبل): راجعت الوثائق ، وفحصت مثيل الخادم عاد من قبل http.createServer () ، وقراءة التعليمات البرمجية المصدر server.listen () ...

للأسف ، يتم تخزين المنفذ مؤقتًا كمتغير محلي فقط وينتهي كوسيطة في استدعاء process.binding ('net'). bind () وهو أسلوب أصلي. لم أكن انظر أبعد من ذلك.

يبدو أنه لا توجد طريقة أفضل من الاحتفاظ بإشارة إلى قيمة المنفذ التي قدمتها إلى server.listen ().



4.x Express الإجابة:

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

اكسبرس 3 الإجابة:

أعتقد أنك تبحث عن هذا (تعبير محدد؟):

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

ربما تكون قد رأيت هذا (الخط السفلي) ، عندما تقوم بإنشاء بنية دليل من أمر express :

[email protected]:~/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
[email protected]:~/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)
}

لم يكن ضروريًا استخدام وحدة http.

لا يعد الاستيراد الإضافي لـ http ضروريًا في Express 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 ضروريًا أبدًا. ترجع طريقة الاستماع كائن خادم http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531


req.headers.host.split(':')[1]

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