2016-06-26 6 views
0

Ich bin ziemlich neu zu nodejs und sehr neu zu socket.io und express. Ich habe Code, der funktioniert, aber ich habe Probleme zu verstehen, warum er funktioniert.Socket.io mit Express, woher weiß die Express-App, auf welchen Port sie hören soll?

Meine Frage für den folgenden Code ist, wie kann die Express-App auf Port 80 hören? Es gibt einen server.listen. Aber es gibt keine app.listen im Code. Doch app.post() akzeptiert bereitgestellte Daten.

Bitte beachten Sie die folgenden Code

var https = require('https'); 
var url = require('url'); 
var fs = require('fs'); 
var bodyParser = require('body-parser'); 
var express = require('express'); 
var app = express(); 
//var io = require('socket.io'); 
var zlib = require('zlib'); 

app.use(bodyParser.urlencoded({extended: true })); 

var options = { 
    key: fs.readFileSync('my.key'), 
    cert: fs.readFileSync('my.crt') 
}; 


var serverPort = 80; 
var server = https.createServer(options, app); 
var io = require('socket.io')(server); 


// log when the server is ready 
server.listen(serverPort, function() { 
    console.log('Web socket server up and running at port %s', serverPort); 
    // this prints 80, as expected 
}); 


app.post('/api', function (req, res) { 
    // working code is in here that receives the post variables and responds 
} 

Antwort

3

Mit Express ist das Objekt app nur ein Anforderungshandler für einige HTTP-Server. Wenn Sie app.listen() aufrufen, erstellt das Objekt app einen HTTP-Server für Sie. Aber, wenn Sie Ihre eigenen HTTP-Server erstellt haben (was Ihr Codebeispiel der Fall ist), dann ist das app Objekt wird nur eine Anforderung Hörer auf diesem Server mit dieser Codezeile:

var server = https.createServer(options, app); 

, dass der HTTP-Server erstellt und registriert app als Request Listener (so sieht es alle eingehenden Anfragen). Dadurch kann das Express-App-Objekt dann die Routen, die bei ihm registriert sind, zu Serverrouten wie app.get(...) oder app.post(...) verarbeiten.

Und der Port für Express ist der Port für den http-Server, also ist es der Port, der verwendet wurde, als der http-Server erstellt wurde. Was hier wichtig ist, ist, dass Express kein eigener Server ist. Es ist nur ein Request-Listener für einige HTTP-Server.

In Ihrem Codebeispiel ist Ihr http-Server für Port 80 eingerichtet, also wird der Port verwendet, und Express wird als Anforderungshandler für all diese eingehenden http-Anforderungen an diesem Port registriert.


Wenn man sich die source code for app.listen() sehen, Sie sehen:

app.listen = function listen() { 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
}; 

zusammen, es ist ein HTTP-Server mit dem app Objekt als Zuhörer erstellen und dann .listen() rufen auf diesem neuen Server.

+0

Danke! Das macht es wirklich klar. So frustrierend, wenn etwas funktioniert und ich verstehe nicht warum. – Deltaxfx

0

die App nicht zu wissen haben, auf dem Port zu hören. Im Wesentlichen ist server Ihre HTTP-Serverbindung, die in Ihrem Beispiel Port 80 überwacht. var server = https.createServer(options, app); teilt dann dem Server mit, Port 80 für HTTP-Anfragen anzuhören und sie an Ihre App weiterzuleiten. Die App führt dann das Routing-Zeug durch, das die von Ihnen angegebene Funktion mit app.post(...) mit einer spezifischen Anfrage-URL verbindet (in diesem Fall/api).

TL; DR: Die App muss nicht zuhören, da der Server die einzige Kommunikationsschnittstelle nach außen ist.

Verwandte Themen