Wie überlade ich die Funktionalität von app.listen in expressjs

8

Ich habe versucht, (im Prinzip) eine Factory-Funktion zu erstellen, die einen Expressjs-Server für ein Dutzend kleinerer spezialisierter Server konfiguriert und erstellt. Für einen Teil davon möchte ich die Listenfunktion erweitern.

Ich würde gerne wissen, wie es am besten geht. Ich bin auch auf der Suche nach einer wiederverwendbaren Designauswahl.

Server wird normalerweise erstellt:

%Vor%

Wegen der Art und Weise, wie Express entworfen wurde (nicht sicher, ob ich richtig bin), kann ich nicht auf einen {whatever} .prototype.listen zugreifen. Also habe ich zwei Ansätze entwickelt.

Verwenden einer zusätzlichen Variable im aktuellen Bereich:

%Vor%

Was funktioniert und ist ziemlich geradlinig, aber dann habe ich eine variable Warze. Ich habe auch eine Verschlusslösung, aber ich denke, dass es zu stumpf ist, um praktisch zu sein:

%Vor%

Beide Beispiele sind Teil des Factory-Kontextes und ich reduziere absichtlich die an die Funktion übergebenen Argumente.

Jede Hilfe wäre willkommen.

    
Jotham 02.09.2014, 02:59
quelle

4 Antworten

2

Wenn Sie auf "Überladung" bestehen, stellen Sie sicher, dass Sie den Original-Footprint implementieren (dies ist die Art der Überladung). Express listen ist nur ein Alias ​​für die Methode des internen http listen-Verfahrens des Knotens

%Vor%

UPDATE: Express empfiehlt sogar, die Server-API des Knotens für benutzerdefinierte Implementierungen zu verwenden: Ссылка

Andernfalls sollten Sie Ihre eigene benutzerdefinierte Methode listen erstellen, die wie folgt definiert wäre:

%Vor%

Die zweite Option ist Ihre beste Wahl, aber damit es funktioniert, müssen Sie die Express-Bibliothek erweitern. Express ist Open Source und wird auf Github gehostet. Fork es und modifiziere es wie du willst. Periodisch pull in neuen Updates, damit Sie immer auf dem neuesten Stand der Kernbibliothek sind. Ich mache das ständig mit Knotenmodulen.

Dies hat zwei Vorteile:

  1. Sie haben die vollständige Kontrolle über die Anpassung des Codes, wie Sie es für richtig halten, während Sie mit dem Code der ursprünglichen Autoren auf dem neuesten Stand bleiben.

  2. Wenn Sie einen Fehler finden oder ein cooles Feature erstellen, können Sie eine Pull-Anfrage senden, um die Community insgesamt zu unterstützen.

Sie würden zuerst das Repository forkieren, dann die URL für Ihre Verzweigung übernehmen, sie klonen und dann einen Verweis auf das ursprüngliche "upstream" -Repo hinzufügen:

%Vor%

Dann können Sie Änderungen an Ihren eigenen Repo ( git push ) schieben. Wenn Sie Updates aus dem ursprünglichen Repo erhalten möchten, können Sie den Upstream-Repo verwenden: git pull upstream master .

Wenn Sie Ihren benutzerdefinierten Fork von Express als NPM-Modul für ein Projekt hinzufügen möchten, verwenden Sie Folgendes:

%Vor%     
Ryan Wheale 01.01.2015 23:10
quelle
2

Wie Victors Antwort darauf hingewiesen hat, befindet sich der Prototyp von express in express/lib/application.js . Diese Datei wird zum Erstellen von Express verwendet und über den Namensraum application in express/lib/express.js exportiert. . Daher kann die Funktion .listen mithilfe von express.appliction.listen referenziert werden.

Man kann diese Methode dann verwenden: (ähnlich der Methode von Victor)

%Vor%

Man kann auch die Funktion _.wrap von Lo-dash verwenden, wenn die Basisfunktion nicht in einer Variablen gespeichert werden soll dich selber. Es würde ungefähr so ​​aussehen:

%Vor%

Die Verwendung dieser Methoden würde jedoch zu den Problemen führen, die Sie in Ihrer Frage erwähnt haben (Variable histing, Erstellen einer zusätzlichen Variablen). Um dies zu lösen, würde ich normalerweise meine eigene Unterklasse von express.application erstellen und die .listen -Funktion in dieser Unterklasse ersetzen und stattdessen express die Verwendung dieser Unterklasse mitteilen. Aufgrund der aktuellen Struktur von express können Sie express.application jedoch nicht durch Ihre eigene Unterklasse ersetzen, ohne die Funktion express() selbst zu überschreiben.

Ich würde also express.application.listen komplett übernehmen, da es nur 2 Zeilen sind. Es ist ziemlich einfach!

%Vor%

Sie können sogar eine https-Option erstellen!

%Vor%

Hinweis: Eine der anderen Antworten erwähnt das Forken und Modifizieren. Ich würde es schwer haben, das für so eine kleine Aufgabe zu rechtfertigen.

    
tyronegcarter 04.01.2015 04:26
quelle
1

Sie sollten die Express-Listenfunktion leicht übersteuern können. Sie können darauf im folgenden Objektpfad zugreifen: express.application.listen

Sie können also Folgendes implementieren:

%Vor%

Die Implementierung der listen-Funktion befindet sich im folgenden Pfad unter dem Express-Modul-Ordner: node_modules\express\lib\application.js

    
Víctor Iniesta 29.12.2014 15:16
quelle
-1

Binden und überwachen Sie die Verbindungen auf dem angegebenen Host und Port. Diese Methode ist mit dem http.Server # listen () des Knotens identisch.

%Vor%

Die von express () zurückgegebene App ist eine JavaScript-Funktion, die an die HTTP-Server des Knotens als Rückruf zur Verarbeitung von Anforderungen übergeben wird. Dadurch können Sie sowohl HTTP- als auch HTTPS-Versionen Ihrer App mit der gleichen Codebasis bereitstellen, da die App nicht von diesen erbt (es handelt sich einfach um einen Rückruf):

%Vor%

Die Methode app.listen () ist eine bequeme Methode für Folgendes (wenn Sie HTTPS verwenden oder beides bereitstellen möchten, verwenden Sie die obige Technik):

%Vor%

Referenz : Ссылка

Hoffnung Das hilft.

    
SUNDARRAJAN K 30.12.2014 05:09
quelle

Tags und Links