Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen info
Edge Microgateway v. 2.5.x
Zielgruppe
Dieses Thema richtet sich an Entwickler, die die Funktionen von Edge Microgateway durch das Schreiben benutzerdefinierter Plug-ins erweitern möchten. Wenn Sie ein neues Plug-in schreiben möchten, sind Kenntnisse in JavaScript und Node.js erforderlich.
Was ist ein benutzerdefiniertes Edge Microgateway-Plug-in?
Ein Plug-in ist ein Node.js-Modul, das Edge Microgateway Funktionen hinzufügt. Plugin-Module folgen einem einheitlichen Muster und werden an einem Ort gespeichert, der Edge Microgateway bekannt ist. So können sie automatisch erkannt und ausgeführt werden. Bei der Installation von Edge Microgateway werden mehrere vordefinierte Plug-ins bereitgestellt. Dazu gehören Plug-ins für Authentifizierung, Spike-Arrest, Kontingent und Analysen. Diese vorhandenen Plug-ins werden unter Plug-ins verwenden beschrieben.
Sie können dem Microgateway neue Funktionen hinzufügen, indem Sie benutzerdefinierte Plug-ins schreiben. Standardmäßig ist Edge Microgateway im Wesentlichen ein sicherer Pass-Through-Proxy, der Anfragen und Antworten unverändert an und von Zieldiensten weiterleitet. Mit benutzerdefinierten Plug-ins können Sie programmatisch mit den Anfragen und Antworten interagieren, die über das Microgateway fließen.
Wo benutzerdefinierter Plug-in-Code eingefügt werden muss
Im Rahmen der Edge Microgateway-Installation ist ein Ordner für benutzerdefinierte Plug-ins enthalten:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
Dabei ist [prefix] das npm-Präfixverzeichnis, wie unter „Wo ist Edge Microgateway installiert?“ in Edge Microgateway installieren beschrieben.
Sie können dieses Standard-Plug-in-Verzeichnis ändern. Weitere Informationen
Vordefinierte Plug-ins ansehen
Bevor Sie versuchen, ein eigenes Plug-in zu entwickeln, sollten Sie prüfen, ob eines der vordefinierten Plug-ins Ihren Anforderungen entspricht. Diese Plug-ins befinden sich unter:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
Dabei ist [prefix] das npm-Präfixverzeichnis. Weitere Informationen finden Sie unter Edge Microgateway installieren im Abschnitt „Wo wird Edge Microgateway installiert?“.
Weitere Informationen finden Sie unter Vordefinierte Plug-ins, die mit Edge Microgateway bereitgestellt werden.
Einfaches Plug‑in schreiben
In diesem Abschnitt werden die Schritte zum Erstellen eines einfachen Plug-ins beschrieben. Dieses Plug-in überschreibt die Antwortdaten (unabhängig davon, was sie sind) mit dem String „Hello, World!“ und gibt sie im Terminal aus.
- Wenn Edge Microgateway ausgeführt wird, beenden Sie es jetzt:
edgemicro stop
-
cdin das Verzeichnis für benutzerdefinierte Plug-ins:cd [prefix]/lib/node_modules/edgemicro/pluginsDabei ist
[prefix]dasnpm-Präfixverzeichnis, wie unter „Wo ist Edge Microgateway installiert?“ in Edge Microgateway installieren beschrieben. - Erstellen Sie ein neues Plug‑in-Projekt mit dem Namen response-override und
cdrufen Sie dieses Verzeichnis auf:
mkdir response-override && cd response-override
- Erstellen Sie ein neues Node.js-Projekt:
Drücken Sie mehrmals die Eingabetaste, um die Standardeinstellungen zu übernehmen.npm init
- Erstellen Sie mit einem Texteditor eine neue Datei mit dem Namen
index.js. - Kopieren Sie den folgenden Code in
index.jsund speichern Sie die Datei.
'use strict'; var debug = require('debug') module.exports.init = function(config, logger, stats) { return { ondata_response: function(req, res, data, next) { debug('***** plugin ondata_response'); next(null, null); }, onend_response: function(req, res, data, next) { debug('***** plugin onend_response'); next(null, "Hello, World!\n\n"); } }; }
- Nachdem Sie ein Plug-in erstellt haben, müssen Sie es der Edge Microgateway-Konfiguration hinzufügen.
Öffnen Sie die Datei
$HOME/.edgemicro/[org]-[env]-config.yaml, wobeiorgundenvdie Namen Ihrer Edge-Organisation und -Umgebung sind. - Fügen Sie das
response-override-Plug-in demplugins:sequence-Element hinzu, wie unten dargestellt.
... plugins: dir: ../plugins sequence: - oauth - response-override ... - Starten Sie Edge Microgateway neu.
- Eine API über Edge Microgateway aufrufen Bei diesem API-Aufruf wird davon ausgegangen, dass Sie die gleiche Konfiguration wie im Tutorial mit API-Schlüssel-Sicherheit eingerichtet haben, wie unter Edge Microgateway einrichten und konfigurieren beschrieben:
curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo Hello, World!
Aufbau eines Plug-ins
Das folgende Edge Microgateway-Beispiel-Plug-in veranschaulicht das Muster, das Sie beim Entwickeln eigener Plug-ins verwenden sollten. Der Quellcode für das in diesem Abschnitt beschriebene Beispiel-Plug-in befindet sich im Verzeichnis plugins/header-uppercase/index.js..
- Plug-ins sind Standard-NPM-Module mit einer
package.json- und einerindex.js-Datei im Stammordner. - Ein Plug-in muss eine init()-Funktion exportieren.
- Die Funktion init() verwendet drei Argumente: config, logger und stats. Diese Argumente werden unter „Argumente der Funktion init() des Plug-ins“ beschrieben.
- init() gibt ein Objekt mit benannten Funktions-Handlern zurück, die aufgerufen werden, wenn während des Lebenszyklus einer Anfrage bestimmte Ereignisse eintreten.
Event-Handler-Funktionen
Ein Plug-in muss einige oder alle dieser Event-Handler-Funktionen implementieren. Die Implementierung dieser Funktionen liegt bei Ihnen. Jede Funktion ist optional und ein typisches Plug-in implementiert mindestens einen Teil dieser Funktionen.
Event-Handler für den Anfrageablauf
Diese Funktionen werden bei Request-Ereignissen in Edge Microgateway aufgerufen.
onrequestondata_requestonend_requestonclose_requestonerror_request
onrequest Funktion
Wird zu Beginn der Clientanfrage aufgerufen. Diese Funktion wird ausgelöst, wenn das erste Byte der Anfrage von Edge Microgateway empfangen wird. Mit dieser Funktion haben Sie Zugriff auf die Anfrageheader, die URL, die Abfrageparameter und die HTTP-Methode. Wenn Sie „next“ mit einem ersten Argument aufrufen, das als „truthy“ gilt (z. B. eine Instanz von „Error“), wird die Anfrageverarbeitung beendet und es wird keine Zielanfrage initiiert.
Beispiel:
onrequest: function(req, res, next) { debug('plugin onrequest'); req.headers['x-foo-request-start'] = Date.now(); next(); }
ondata_request Funktion
Wird aufgerufen, wenn ein Datenblock vom Client empfangen wird. Übergibt Anfragedaten an das nächste Plug-in in der Plug-in-Sequenz. Der zurückgegebene Wert des letzten Plug-ins in der Sequenz wird an das Ziel gesendet. Ein typischer Anwendungsfall, der unten dargestellt ist, besteht darin, die Anfragedaten zu transformieren, bevor sie an das Ziel gesendet werden.
Beispiel:
ondata_request: function(req, res, data, next) { debug('plugin ondata_request ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }
onend_request Funktion
Wird aufgerufen, wenn alle Anfragedaten vom Client empfangen wurden.
Beispiel:
onend_request: function(req, res, data, next) { debug('plugin onend_request'); next(null, data); }
onclose_request-Function
Gibt an, dass die Clientverbindung geschlossen wurde. Sie können diese Funktion verwenden, wenn die Clientverbindung unzuverlässig ist. Sie wird aufgerufen, wenn die Socket-Verbindung zum Client geschlossen wird.
Beispiel:
onclose_request: function(req, res, next) { debug('plugin onclose_request'); next(); }
onerror_request-Function
Wird aufgerufen, wenn beim Empfangen der Clientanfrage ein Fehler auftritt.
Beispiel:
onerror_request: function(req, res, err, next) { debug('plugin onerror_request ' + err); next(); }
Event-Handler für Antwortabläufe
Diese Funktionen werden bei Antwort-Ereignissen in Edge Microgateway aufgerufen.
onresponseondata_responseonend_responseonclose_responseonerror_response
onresponse-Function
Wird zu Beginn der Zielantwort aufgerufen. Diese Funktion wird ausgelöst, wenn das erste Byte der Antwort von Edge Microgateway empfangen wird. Mit dieser Funktion haben Sie Zugriff auf die Antwortheader und den Statuscode.
Beispiel:
onresponse: function(req, res, next) { debug('plugin onresponse'); res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start']) next(); }
ondata_response-Funktion
Wird aufgerufen, wenn ein Datenblock vom Ziel empfangen wird.
Beispiel:
ondata_response: function(req, res, data, next) { debug('plugin ondata_response ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }
onend_response-Funktion
Wird aufgerufen, wenn alle Antwortdaten vom Ziel empfangen wurden.
Beispiel:
onend_response: function(req, res, data, next) { debug('plugin onend_response'); next(null, data); }
onclose_response-Function
Gibt an, dass die Zielverbindung geschlossen wurde. Sie können diese Funktion verwenden, wenn die Zielverbindung unzuverlässig ist. Wird aufgerufen, wenn die Socketverbindung zum Ziel geschlossen wird.
Beispiel:
onclose_response: function(req, res, next) { debug('plugin onclose_response'); next(); }
onerror_response-Funktion
Wird aufgerufen, wenn beim Empfangen der Zielantwort ein Fehler auftritt.
Beispiel:
onerror_response: function(req, res, err, next) { debug('plugin onerror_response ' + err); next(); }
Wichtige Informationen zu den Funktionen für die Verarbeitung von Plug-in-Ereignissen
Plugin-Ereignis-Handler-Funktionen werden als Reaktion auf bestimmte Ereignisse aufgerufen, die auftreten, während Edge Microgateway eine bestimmte API-Anfrage verarbeitet.
- Jeder der init()-Funktionshandler (ondata_request, ondata_response usw.) muss den next()-Callback aufrufen, wenn die Verarbeitung abgeschlossen ist. Wenn Sie next() nicht aufrufen, wird die Verarbeitung beendet und die Anfrage bleibt hängen.
- Das erste Argument für next() kann ein Fehler sein, der dazu führt, dass die Verarbeitung der Anfrage beendet wird.
- Die Handler ondata_ und onend_ müssen next() mit einem zweiten Argument aufrufen, das die Daten enthält, die an das Ziel oder den Client übergeben werden sollen. Dieses Argument kann null sein, wenn das Plug-in puffert und derzeit nicht genügend Daten für die Transformation vorhanden sind.
- Beachten Sie, dass eine einzelne Instanz des Plug-ins verwendet wird, um alle Anfragen und Antworten zu verarbeiten. Wenn ein Plug-in den Status pro Anfrage zwischen Aufrufen beibehalten möchte, kann es diesen Status in einer Eigenschaft speichern, die dem bereitgestellten request-Objekt (req) hinzugefügt wird. Die Lebensdauer dieser Eigenschaft entspricht der Dauer des API-Aufrufs.
- Achten Sie darauf, alle Fehler abzufangen und next() mit dem Fehler aufzurufen. Wenn next() nicht aufgerufen wird, bleibt der API-Aufruf hängen.
- Achten Sie darauf, keine Speicherlecks zu verursachen, da dies die Gesamtleistung von Edge Microgateway beeinträchtigen und zum Absturz führen kann, wenn der Arbeitsspeicher nicht mehr ausreicht.
- Achten Sie darauf, dem Node.js-Modell zu folgen und keine rechenintensiven Aufgaben im Hauptthread auszuführen, da dies die Leistung von Edge Microgateway beeinträchtigen kann.
Die Funktion init() des Plug-ins
In diesem Abschnitt werden die Argumente beschrieben, die an die Funktion init() übergeben werden: config, logger und stats.
config
Ein Konfigurationsobjekt, das nach dem Zusammenführen der Edge Microgateway-Konfigurationsdatei mit Informationen, die von Apigee Edge heruntergeladen werden, z. B. Produkte und Kontingente, abgerufen wird. Die plug-inspezifische Konfiguration finden Sie in diesem Objekt: config.<plugin-name>.
Wenn Sie dem Plugin response-override einen Konfigurationsparameter mit dem Namen param und dem Wert foo hinzufügen möchten, fügen Sie Folgendes in die Datei default.yaml ein:
response-override:
param: fooAnschließend können Sie im Plug-in-Code so auf den Parameter zugreifen:
// Called when response data is received ondata_response: function(req, res, data, next) { debug('***** plugin ondata_response'); debug('***** plugin ondata_response: config.param: ' + config.param); next(null, data); },
In diesem Fall wird „foo“ in der Debug-Ausgabe des Plug-ins angezeigt:
Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo
logger
Der Systemlogger. Der aktuell verwendete Logger exportiert diese Funktionen, wobei „object“ ein String, eine HTTP-Anfrage, eine HTTP-Antwort oder eine Error-Instanz sein kann.
info(object, message)warn(object, message)error(object, message)
Statistiken
Ein Objekt, das die Anzahl der Anfragen, Antworten, Fehler und anderer aggregierter Statistiken im Zusammenhang mit den Anfragen und Antworten enthält, die durch eine Microgateway-Instanz fließen.
- treqErrors: Die Anzahl der Zielanfragen mit Fehlern.
- treqErrors: Die Anzahl der Zielantworten mit Fehlern.
- statusCodes: Ein Objekt mit der Anzahl der Antwortcodes:
{
1: number of target responses with 1xx response codes
2: number of target responses with 2xx response codes
3: number of target responses with 3xx response codes
4: number of target responses with 4xx response codes
5: number of target responses with 5xx response codes
}
- requests: Die Gesamtzahl der Anfragen.
- Antworten: Die Gesamtzahl der Antworten.
- connections (Verbindungen): Die Anzahl der aktiven Zielverbindungen.
Die Funktion „next()“
Alle Plug-in-Methoden müssen next() aufrufen, damit die Verarbeitung der nächsten Methode in der Reihe fortgesetzt wird. Andernfalls bleibt der Plug-in-Prozess hängen. Im Lebenszyklus der Anfrage ist die erste aufgerufene Methode onrequest(). Die nächste aufzurufende Methode ist ondata_request(). ondata_request wird nur aufgerufen, wenn die Anfrage Daten enthält, wie z. B. bei einer POST-Anfrage. Als Nächstes wird die Methode onend_request() aufgerufen, wenn die Verarbeitung der Anfrage abgeschlossen ist. Die onerror_*-Funktionen werden nur im Fehlerfall aufgerufen. Sie ermöglichen es Ihnen, Fehler mit benutzerdefiniertem Code zu beheben.
Angenommen, Daten werden in der Anfrage gesendet und ondata_request() wird aufgerufen. Die Funktion ruft next() mit zwei Parametern auf:
next(null, data);
Konventionsgemäß wird der erste Parameter verwendet, um Fehlerinformationen zu übermitteln, die Sie dann in einer nachfolgenden Funktion in der Kette verarbeiten können. Wenn wir es auf null, ein falsches Argument, setzen, bedeutet das, dass keine Fehler vorliegen und die Verarbeitung der Anfrage normal fortgesetzt werden sollte. Wenn dieses Argument wahr ist (z. B. ein Error-Objekt), wird die Verarbeitung der Anfrage beendet und die Anfrage wird an das Ziel gesendet.
Mit dem zweiten Parameter werden die Anfragedaten an die nächste Funktion in der Kette übergeben. Wenn Sie keine zusätzliche Verarbeitung vornehmen, werden die Anfragedaten unverändert an das Ziel der API übergeben.
Sie haben jedoch die Möglichkeit, die Anfragedaten in dieser Methode zu ändern und die geänderte Anfrage an das Ziel weiterzuleiten. Wenn die Anfragedaten beispielsweise XML sind und das Ziel JSON erwartet, können Sie der Methode ondata_request() Code hinzufügen, der (a) den Content-Type des Anfrageheaders in application/json ändert und die Anfragedaten auf beliebige Weise in JSON konvertiert (z. B. mit einem Node.js-Konverter xml2json von NPM).
So könnte das aussehen:
ondata_request: function(req, res, data, next) { debug('****** plugin ondata_request'); var translated_data = parser.toJson(data); next(null, translated_data); },
In diesem Fall werden die Anfragedaten (die als XML angenommen werden) in JSON konvertiert und die transformierten Daten werden über next() an die nächste Funktion in der Anfragekette übergeben, bevor sie an das Backend-Ziel übergeben werden.
Sie können eine weitere Debugging-Anweisung hinzufügen, um die transformierten Daten für die Fehlerbehebung auszugeben. Beispiel:
ondata_request: function(req, res, data, next) { debug('****** plugin ondata_request'); var translated_data = parser.toJson(data); debug('****** plugin ondata_response: translated_json: ' + translated_json); next(null, translated_data); },
Ausführungsreihenfolge von Plugin-Handlern
Wenn Sie Plug-ins für Edge Microgateway schreiben, müssen Sie die Reihenfolge kennen, in der die Event-Handler von Plug-ins ausgeführt werden.
Wichtig ist, dass die Anfrage-Handler in aufsteigender Reihenfolge und die Antwort-Handler in absteigender Reihenfolge ausgeführt werden, wenn Sie eine Plug-in-Sequenz in der Edge Microgateway-Konfigurationsdatei angeben.
Das folgende Beispiel soll Ihnen helfen, diese Ausführungsreihenfolge zu verstehen.
1. Drei einfache Plug‑ins erstellen
Betrachten Sie das folgende Plug-in. Es gibt lediglich Konsolenausgaben aus, wenn seine Ereignis-Handler aufgerufen werden:
plugins/plugin-1/index.js
module.exports.init = function(config, logger, stats) { return { onrequest: function(req, res, next) { console.log('plugin-1: onrequest'); next(); }, onend_request: function(req, res, data, next) { console.log('plugin-1: onend_request'); next(null, data); }, ondata_response: function(req, res, data, next) { console.log('plugin-1: ondata_response ' + data.length); next(null, data); }, onend_response: function(req, res, data, next) { console.log('plugin-1: onend_response'); next(null, data); } }; }
Erstellen Sie nun zwei weitere Plugins, plugin-2 und plugin-3, mit demselben Code. Ändern Sie jedoch die console.log()-Anweisungen in plugin-2 bzw. plugin-3.
2. Plug-in-Code prüfen
Die exportierten Plug-in-Funktionen in <microgateway-root-dir>/plugins/plugin-1/index.js sind Ereignishandler, die zu bestimmten Zeiten während der Verarbeitung von Anfragen und Antworten ausgeführt werden. onrequest wird beispielsweise ausgeführt, wenn das erste Byte der Anfrageheader empfangen wird. onend_response wird ausgeführt, nachdem das letzte Byte der Antwortdaten empfangen wurde.
Sehen Sie sich den Handler „ondata_response“ an. Er wird immer aufgerufen, wenn ein Teil der Antwortdaten empfangen wird. Wichtig ist, dass Antwortdaten nicht unbedingt alle auf einmal empfangen werden. Stattdessen können die Daten in Blöcken beliebiger Länge empfangen werden.
3. Plug‑ins zur Plug‑in-Sequenz hinzufügen
In diesem Beispiel fügen wir die Plug-ins der Plug-in-Sequenz in der Edge Microgateway-Konfigurationsdatei (~./edgemicro/config.yaml) hinzu. Die Reihenfolge ist wichtig. Sie definiert die Reihenfolge, in der die Plug-in-Handler ausgeführt werden.
plugins:
dir: ../plugins
sequence:
- plugin-1
- plugin-2
- plugin-3
4. Debug-Ausgabe prüfen
Sehen wir uns nun die Ausgabe an, die bei Aufruf dieser Plugins erzeugt wird. Hier sind einige wichtige Punkte, die Sie beachten sollten:
- Die Reihenfolge der Plug-ins in der Edge Microgateway-Konfigurationsdatei (
~./edgemicro/config.yaml) gibt die Reihenfolge an, in der Event-Handler aufgerufen werden. - Anfrage-Handler werden in aufsteigender Reihenfolge aufgerufen (in der Reihenfolge, in der sie in der Plug-in-Sequenz erscheinen – 1, 2, 3).
- Antworthandler werden in absteigender Reihenfolge aufgerufen: 3, 2, 1.
- Der
ondata_response-Handler wird einmal für jeden eingehenden Datenblock aufgerufen. In diesem Beispiel (Ausgabe unten) werden zwei Chunks empfangen.
Hier sehen Sie ein Beispiel für die Debug-Ausgabe, die erzeugt wird, wenn diese drei Plug-ins verwendet werden und eine Anfrage über Edge Microgateway gesendet wird. Beachten Sie die Reihenfolge, in der die Handler aufgerufen werden:
plugin-1: onrequest plugin-2: onrequest plugin-3: onrequest plugin-1: onend_request plugin-2: onend_request plugin-3: onend_request plugin-3: ondata_response 931 plugin-2: ondata_response 931 plugin-1: ondata_response 931 plugin-3: ondata_response 1808 plugin-3: onend_response plugin-2: ondata_response 1808 plugin-2: onend_response plugin-1: ondata_response 1808 plugin-1: onend_response
Zusammenfassung
Die Reihenfolge, in der die Plug-in-Handler aufgerufen werden, ist sehr wichtig, wenn Sie benutzerdefinierte Plug-in-Funktionen implementieren möchten, z. B. das Erfassen und Transformieren von Anforderungs- oder Antwortdaten.
Denken Sie daran, dass Anfrage-Handler in der Reihenfolge ausgeführt werden, in der die Plug-ins in der Edge Microgateway-Konfigurationsdatei angegeben sind, und Antwort-Handler in der umgekehrten Reihenfolge.
Globale Variablen in Plug-ins verwenden
Jede Anfrage an Edge Microgateway wird an dieselbe Instanz eines Plug-ins gesendet. Daher wird der Status einer zweiten Anfrage von einem anderen Client den Status der ersten Anfrage überschreiben. Der einzige sichere Ort zum Speichern des Plug-in-Status ist eine Eigenschaft des Anfrage- oder Antwortobjekts, dessen Lebensdauer auf die der Anfrage beschränkt ist.
Ziel-URLs in Plug-ins umschreiben
Hinzugefügt in Version 2.3.3
Sie können die Standardziel-URL in einem Plug-in dynamisch überschreiben, indem Sie die folgenden Variablen in Ihrem Plug-in-Code ändern: req.targetHostname und req.targetPath.
Hinzugefügt in: v2.4.x
Sie können auch den Zielendpunktport überschreiben und zwischen HTTP und HTTPS wählen. Ändern Sie diese Variablen in Ihrem Plug-in-Code: req.targetPort und req.targetSecure. Wenn Sie HTTPS auswählen möchten, legen Sie req.targetSecure auf true fest. Für HTTP legen Sie es auf false fest. Wenn Sie „req.targetSecure“ auf „true“ setzen, finden Sie in diesem Diskussionsforum weitere Informationen.
Beispiel-Plug-ins
Diese Plug-ins werden mit Ihrer Edge Microgateway-Installation bereitgestellt. Sie finden sie in der Edge Microgateway-Installation hier:
[prefix]/lib/node_modules/edgemicro/plugins
Dabei ist [prefix] das npm-Präfixverzeichnis, wie unter „Wo ist Edge Microgateway installiert?“ in Edge Microgateway installieren beschrieben.
accumulate-request
Dieses Plug-in sammelt Datenblöcke vom Client in einer Array-Property, die dem Anfrageobjekt angehängt ist. Wenn alle Anforderungsdaten empfangen wurden, wird das Array in einen Puffer verkettet, der dann an das nächste Plug-in in der Sequenz übergeben wird. Dieses Plug-in sollte das erste in der Sequenz sein, damit nachfolgende Plug-ins die gesammelten Anfragedaten erhalten.
module.exports.init = function(config, logger, stats) { function accumulate(req, data) { if (!req._chunks) req._chunks = []; req._chunks.push(data); } return { ondata_request: function(req, res, data, next) { if (data && data.length > 0) accumulate(req, data); next(null, null); }, onend_request: function(req, res, data, next) { if (data && data.length > 0) accumulate(req, data); var content = null; if (req._chunks && req._chunks.length) { content = Buffer.concat(req._chunks); } delete req._chunks; next(null, content); } }; }
accumulate-response
Dieses Plug-in sammelt Datenblöcke aus dem Ziel in einer Array-Property, die an das Antwortobjekt angehängt ist. Wenn alle Antwortdaten empfangen wurden, wird das Array in einem Puffer verkettet, der dann an das nächste Plug-in in der Sequenz übergeben wird. Da dieses Plug-in für Antworten verwendet wird, die in umgekehrter Reihenfolge verarbeitet werden, sollten Sie es als letztes Plug-in in der Sequenz platzieren.
module.exports.init = function(config, logger, stats) { function accumulate(res, data) { if (!res._chunks) res._chunks = []; res._chunks.push(data); } return { ondata_response: function(req, res, data, next) { if (data && data.length > 0) accumulate(res, data); next(null, null); }, onend_response: function(req, res, data, next) { if (data && data.length > 0) accumulate(res, data); var content = Buffer.concat(res._chunks); delete res._chunks; next(null, content); } }; }
„header-uppercase“-Plug-in
Edge Microgateway-Distributionen enthalten ein Beispiel-Plug-in namens <microgateway-root-dir>/plugins/header-uppercase. Das Beispiel enthält Kommentare, in denen die einzelnen Funktionshandler beschrieben werden. In diesem Beispiel werden einige einfache Datentransformationen der Zielantwort vorgenommen und der Clientanfrage und Zielantwort benutzerdefinierte Header hinzugefügt.
Hier ist der Quellcode für <microgateway-root-dir>/plugins/header-uppercase/index.js:
'use strict'; var debug = require('debug')('plugin:header-uppercase'); // required module.exports.init = function(config, logger, stats) { var counter = 0; return { // indicates start of client request // request headers, url, query params, method should be available at this time // request processing stops (and a target request is not initiated) if // next is called with a truthy first argument (an instance of Error, for example) onrequest: function(req, res, next) { debug('plugin onrequest'); req.headers['x-foo-request-id'] = counter++; req.headers['x-foo-request-start'] = Date.now(); next(); }, // indicates start of target response // response headers and status code should be available at this time onresponse: function(req, res, next) { debug('plugin onresponse'); res.setHeader('x-foo-response-id', req.headers['x-foo-request-id']); res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start']); next(); }, // chunk of request body data received from client // should return (potentially) transformed data for next plugin in chain // the returned value from the last plugin in the chain is written to the target ondata_request: function(req, res, data, next) { debug('plugin ondata_request ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }, // chunk of response body data received from target // should return (potentially) transformed data for next plugin in chain // the returned value from the last plugin in the chain is written to the client ondata_response: function(req, res, data, next) { debug('plugin ondata_response ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }, // indicates end of client request onend_request: function(req, res, data, next) { debug('plugin onend_request'); next(null, data); }, // indicates end of target response onend_response: function(req, res, data, next) { debug('plugin onend_response'); next(null, data); }, // error receiving client request onerror_request: function(req, res, err, next) { debug('plugin onerror_request ' + err); next(); }, // error receiving target response onerror_response: function(req, res, err, next) { debug('plugin onerror_response ' + err); next(); }, // indicates client connection closed onclose_request: function(req, res, next) { debug('plugin onclose_request'); next(); }, // indicates target connection closed onclose_response: function(req, res, next) { debug('plugin onclose_response'); next(); } }; }
transform-uppercase
Dies ist ein allgemeines Transformations-Plug-in, das Sie nach Belieben anpassen können. In diesem Beispiel werden die Antwort- und Anfragedaten einfach in Großbuchstaben umgewandelt.
*/ module.exports.init = function(config, logger, stats) { // perform content transformation here // the result of the transformation must be another Buffer function transform(data) { return new Buffer(data.toString().toUpperCase()); } return { ondata_response: function(req, res, data, next) { // transform each chunk as it is received next(null, data ? transform(data) : null); }, onend_response: function(req, res, data, next) { // transform accumulated data, if any next(null, data ? transform(data) : null); }, ondata_request: function(req, res, data, next) { // transform each chunk as it is received next(null, data ? transform(data) : null); }, onend_request: function(req, res, data, next) { // transform accumulated data, if any next(null, data ? transform(data) : null); } }; }