Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Edge Microgateway wer. 3.2.x
Odbiorcy
Ten temat jest przeznaczony dla programistów, którzy chcą rozszerzyć funkcje Edge Microgateway, pisząc niestandardowe wtyczki. Jeśli chcesz napisać nową wtyczkę, zapoznaj się z JavaScriptem i Node.js
Czym jest niestandardowa wtyczka Edge Microgateway?
Wtyczka to moduł Node.js, który zapewnia dodatkowe funkcje do Edge Microgateway. Moduły wtyczek są zgodne ze spójnym wzorcem i przechowywane w lokalizacji znanej Edge Microgateway, co umożliwia aby były wykrywane i uruchamiane automatycznie. Dostępnych jest kilka wstępnie zdefiniowanych wtyczek zainstalować Edge Microgateway. Są to między innymi wtyczki do uwierzytelniania, zatrzymania szczytu, limitu Analytics. Informacje o istniejących wtyczkach znajdziesz w artykule Korzystanie z wtyczek.
Możesz dodać do mikrobramy nowe funkcje i możliwości, wpisując custom Edge Microgateway to domyślnie bezpieczny, przekazujący serwer proxy, przekazuje niezmienione żądania i odpowiedzi do i z usług docelowych. Dzięki niestandardowym wtyczkom możesz: automatycznie wchodzą w interakcje z żądaniami i odpowiedziami, które przechodzą przez mikrobramę.
Gdzie umieścić kod wtyczki niestandardowej
Folder na potrzeby niestandardowych wtyczek jest dołączany do instalacji Edge Microgateway tutaj:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix]
to katalog z prefiksem npm
jako
opisane w sekcji „Gdzie jest zainstalowana Edge Microgateway” w instalacji Edge
Microgateway.
Możesz zmienić ten domyślny katalog wtyczek. Zobacz Gdzie znaleźć
Sprawdzanie wstępnie zdefiniowanych wtyczek
Zanim utworzysz własną wtyczkę, sprawdź, czy żaden wstępnie zdefiniowany które spełniają wymagania. Te wtyczki znajdują się w:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix]
to katalog prefiksów npm
. Zobacz
też „Gdzie jest zainstalowana Edge Microgateway”. w sekcji Instalowanie Edge
Microgateway.
Szczegółowe informacje można znaleźć w artykule Wstępnie zdefiniowane i wtyczki udostępniane przez Edge Microgateway.
Napisanie prostej wtyczki
W tej sekcji omówimy kroki wymagane do utworzenia prostej wtyczki. Ta wtyczka zastępuje dane odpowiedzi (cokolwiek to jest) ciągiem „Hello, World!”, i drukuje ją na złącze.
.- Jeśli Edge Microgateway jest uruchomiona, zatrzymaj ją teraz:
edgemicro stop
-
cd
do katalogu wtyczek niestandardowych:cd [prefix]/lib/node_modules/edgemicro/plugins
gdzie
[prefix]
to katalog prefiksównpm
zgodnie z opisem w sekcji „Gdzie zainstalowano Edge Microgateway” w instalacji Edge Microgateway. - Utwórz nowy projekt wtyczki o nazwie response-override i
cd
. :
mkdir response-override && cd response-override
- Utwórz nowy projekt Node.js:
Aby zaakceptować wartości domyślne, kilka razy naciśnij klawisz Return.npm init
- W edytorze tekstu utwórz nowy plik o nazwie
index.js
. - Skopiuj ten kod do usługi
index.js
i zapisz plik.
'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"); } }; }
- Masz już utworzoną wtyczkę, którą musisz dodać do konfiguracji Edge Microgateway.
Otwórz plik
$HOME/.edgemicro/[org]-[env]-config.yaml
, gdzieorg
ienv
to nazwy organizacji i środowiska Edge. - Dodaj wtyczkę
response-override
do elementuplugins:sequence
jak pokazano poniżej.
... plugins: dir: ../plugins sequence: - oauth - response-override ...
- Uruchom ponownie Edge Microgateway.
- Wywołaj interfejs API za pomocą Edge Microgateway. (To wywołanie interfejsu API zakłada, że masz skonfigurowane
konfiguracji jako samouczka dotyczącego zabezpieczeń klucza interfejsu API, jak opisano w sekcji Konfigurowanie
i konfigurowanie Edge Microgateway:
curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo Hello, World!
Składnia wtyczki
Poniższa przykładowa wtyczka Edge Microgateway przedstawia wzorzec, który należy zastosować, gdy
tworzenia własnych wtyczek. Kod źródłowy przykładowej wtyczki omówionej w tej sekcji to
plugins/header-uppercase/index.js.
- Wtyczki to standardowe moduły NPM z interfejsami
package.json
iindex.js
. w folderze głównym. - Wtyczka musi wyeksportować funkcję init().
- Funkcja init() przyjmuje 3 argumenty: config, logger i stats. Argumenty te zostały opisane we wtyczce argumentów funkcji init().
- init() zwraca obiekt z modułami obsługi funkcji nazwanych, które są wywoływane, gdy określone zdarzenia zachodzą w trakcie realizacji żądania.
Funkcje obsługi zdarzeń
Wtyczka musi implementować niektóre lub wszystkie z tych funkcji obsługi zdarzeń. Wdrożenie zależy od Ciebie. Każda funkcja jest opcjonalna, a typowa wtyczka zostanie zaimplementowana przynajmniej podzbioru tych funkcji.
Moduły obsługi zdarzeń przepływu żądań
Te funkcje są wywoływane w przypadku zdarzeń żądania w Edge Microgateway.
onrequest
ondata_request
onend_request
onclose_request
onerror_request
funkcja onrequest
Wywoływane na początku żądania klienta. Ta funkcja jest uruchamiana, gdy pierwszy bajt to żądanie jest odbierane przez Edge Microgateway. Ta funkcja daje dostęp do nagłówków żądań, adres URL, parametry zapytania i metodę HTTP. Jeśli wywołujesz następny argument, podając prawdziwy pierwszy argument (np. wystąpienia błędu), przetwarzanie żądania zostanie zatrzymane, a żądanie docelowe nie zostanie zainicjowane.
Przykład:
onrequest: function(req, res, next) { debug('plugin onrequest'); req.headers['x-foo-request-start'] = Date.now(); next(); }
funkcja ondata_request
Wywoływane po otrzymaniu fragmentu danych od klienta. Przenosi żądania danych do następnej w sekwencji wtyczki. Wartość zwrócona z ostatniej wtyczki w sekwencji jest wysyłana do wartość docelową. Typowym zastosowaniem pokazanym poniżej jest przekształcenie danych żądania przed ich wysłaniem. do wartości docelowej.
Przykład:
ondata_request: function(req, res, data, next) { debug('plugin ondata_request ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }
funkcja onend_request
Wywoływane po otrzymaniu od klienta wszystkich danych żądania.
Przykład:
onend_request: function(req, res, data, next) { debug('plugin onend_request'); next(null, data); }
Funkcja onclose_request
Wskazuje, że połączenie z klientem zostało zamknięte. Możesz użyć tej funkcji, gdy połączenie z klientem jest zawodne. Jest ona wywoływana, gdy połączenie gniazda z klientem jest zamknięto.
Przykład:
onclose_request: function(req, res, next) { debug('plugin onclose_request'); next(); }
Funkcja onerror_request
Wywoływane, jeśli podczas odbierania żądania klienta wystąpił błąd.
Przykład:
onerror_request: function(req, res, err, next) { debug('plugin onerror_request ' + err); next(); }
Moduły obsługi zdarzeń przepływu odpowiedzi
Te funkcje są wywoływane w przypadku zdarzeń odpowiedzi w Edge Microgateway.
onresponse
ondata_response
onend_response
onclose_response
onerror_response
Funkcja onresponse
Wywoływane na początku odpowiedzi docelowej. Ta funkcja jest uruchamiana, gdy pierwszy bajt Odpowiedź jest odebrana przez Edge Microgateway. Ta funkcja zapewnia dostęp do nagłówków odpowiedzi i kod stanu.
Przykład:
onresponse: function(req, res, next) { debug('plugin onresponse'); res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start']) next(); }
Funkcja ondata_response
Wywoływana, gdy z miejsca docelowego zostanie odebrany fragment danych.
Przykład:
ondata_response: function(req, res, data, next) { debug('plugin ondata_response ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }
Funkcja onend_response
Wywoływane po odebraniu wszystkich danych odpowiedzi z celu.
Przykład:
onend_response: function(req, res, data, next) { debug('plugin onend_response'); next(null, data); }
Funkcja onclose_response
Wskazuje, że połączenie docelowe zostało zamknięte. Możesz użyć tej funkcji, gdy jest zawodne. Jest ona wywoływana, gdy połączenie gniazda z miejscem docelowym to zamknięto.
Przykład:
onclose_response: function(req, res, next) { debug('plugin onclose_response'); next(); }
Funkcja onerror_response
Wywoływane, jeśli wystąpił błąd podczas odbierania odpowiedzi docelowej.
Przykład:
onerror_response: function(req, res, err, next) { debug('plugin onerror_response ' + err); next(); }
Co musisz wiedzieć o funkcje obsługi zdarzeń wtyczki
Funkcje obsługi zdarzeń wtyczek są wywoływane w odpowiedzi na określone zdarzenia Edge Microgateway przetwarza dane żądanie do interfejsu API.
- Każdy moduł obsługi funkcji init() (ondata_request, ondata_response itp.) musi wywołać wywołanie zwrotne next() po ich wykonaniu. o przetwarzaniu danych. Jeśli nie wywołasz funkcji next(), przetwarzanie zostanie zatrzymane, a żądanie zwiesz się.
- Pierwszy argument funkcji next() może być błędem, który spowoduje wysłanie żądania w celu zakończenia przetwarzania.
- Moduły ondata_ i onend_ muszą wywoływać funkcje next() z drugim argumentem zawierającym dane, które mają zostać przekazane do wartości docelowej. lub klienta. Ten argument może mieć wartość null, jeśli wtyczka buforuje i nie ma wystarczająco dużo danych, w danym momencie.
- Pamiętaj, że do obsługi wszystkich żądań i odpowiedzi używana jest jedna instancja wtyczki. Jeśli wtyczka chce zachować stan poszczególnych żądań między wywołaniami, może zapisać ten stan w pliku została dodana do dostarczonego obiektu request (req), którego czas trwania to czas trwania wywołania interfejsu API.
- Pamiętaj, by wykryć wszystkie błędy i wywołać funkcję next() z błędem. Nieprzestrzeganie tych zasad wywołanie next() spowoduje zawieszenie wywołania interfejsu API.
- Uważaj, aby nie wprowadzać wycieków pamięci, ponieważ może to mieć wpływ na ogólną wydajność Edge Microgateway i powodować awarię, jeśli zabraknie pamięci.
- Zachowaj zgodność z modelem Node.js i nie wykonuj zadań wymagających dużej mocy obliczeniowej w głównej , ponieważ może to negatywnie wpłynąć na wydajność Edge Microgateway.
Informacje o funkcji init() wtyczki
W tej sekcji opisujemy argumenty przekazywane do funkcji init(): config, logger i stats.
konfiguracja
Dane konfiguracji uzyskane przez połączenie pliku konfiguracji Edge Microgateway z
dane pobrane z Apigee Edge są umieszczane w obiekcie o nazwie config
.
Aby dodać parametr konfiguracji o nazwie param i wartości foo:
do wtyczki o nazwie response-override, umieść to w sekcji default.yaml
plik:
response-override: param: foo
Następnie możesz uzyskać dostęp do parametru w kodzie wtyczki w następujący sposób:
// 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); },
W takim przypadku w danych wyjściowych debugowania wtyczki zobaczysz foo:
Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo
Ty
może uzyskać dostęp do scalonej konfiguracji mikrobramki i pobrać dane Apigee Edge w
obiekt podrzędny config.emgConfigs
. Przykład:
dostęp do tych danych konfiguracji możesz uzyskać w funkcji init
w następujący sposób:
module.exports.init = function(config, logger, stats) { let emgconfigs = config.emgConfigs;
Oto przykładowe dane, które zawiera emgConfigs
:
{ edgemicro: { port: 8000, max_connections: 1000, config_change_poll_interval: 600, logging: { level: 'error', dir: '/var/tmp', stats_log_interval: 60, rotate_interval: 24, stack_trace: false }, plugins: { sequence: [Array] }, global: { org: 'Your Org', env: 'test' } }, headers: { 'x-forwarded-for': true, 'x-forwarded-host': true, 'x-request-id': true, 'x-response-time': true, via: true }, proxies: [ { max_connections: 1000, name: 'edgemicro_delayed', revision: '1', proxy_name: 'default', base_path: '/edgemicro_delayed', target_name: 'default', url: 'https://httpbin.org/delay/10', timeout: 0 } ], product_to_proxy: { EdgeMicroTestProduct: [ 'edgemicro-auth','edgemicro_delayed',] }, product_to_scopes: {prod4: [ 'Admin', 'Guest', 'Student' ] }, product_to_api_resource: { EdgeMicroTestProduct: [ '/*' ] }, _hash: 0, keys: { key: 'Your key', secret: 'Your key ' }, uid: 'Internally generated uuid', targets: [] }
rejestrator
Rejestrator systemowy. Używany obecnie rejestrator eksportuje te funkcje, gdzie można ciąg znaków, żądanie HTTP, odpowiedź HTTP lub wystąpienie błędu.
info(object, message)
warn(object, message)
error(object, message)
trace(object, message)
debug(object, message)
statystyki
Obiekt zawierający liczbę żądań, odpowiedzi, błędów i inne zbiorcze statystyki związane z żądaniami i odpowiedziami przechodzącymi przez instancję mikrobramki.
- treqErrors – liczba żądań docelowych z błędami.
- treqErrors – liczba odpowiedzi docelowych z błędami.
- statusCodes – obiekt zawierający kod odpowiedzi, który zlicza:
{ 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 }
- żądania – łączna liczba żądań.
- responses – łączna liczba odpowiedzi.
- connections (połączenia) – liczba aktywnych połączeń docelowych.
Informacje o funkcji next()
Aby można było kontynuować przetwarzanie następnej metody w parametrze next()
, wszystkie metody wtyczki
(lub proces wtyczki zawiesi się). Pierwsza wywoływana metoda w cyklu życia żądania to
onrequest(). Kolejną wywoływaną metodą jest ondata_request()
. jednak
Funkcja ondata_request
jest wywoływana tylko wtedy, gdy żądanie zawiera dane, na przykład
na przykład dla żądania POST. Następną wywoływaną metodą będzie
onend_request()
, które jest wywoływane po zakończeniu przetwarzania żądania.
Funkcje onerror_*
są wywoływane tylko w przypadku błędu i umożliwiają wykonanie
naprawiaj błędy
za pomocą niestandardowego kodu.
Załóżmy, że w żądaniu zostały wysłane dane, a funkcja ondata_request()
jest wywoływana. Uwaga
które funkcja wywołuje next()
z 2 parametrami:
next(null, data);
Zgodnie z konwencją do przekazania informacji o błędzie jest używany pierwszy parametr, którego możesz następnie
w kolejnej funkcji w łańcuchu. Po ustawieniu na null
jest to fałszywe
, uznamy, że nie ma błędów i przetwarzanie żądań powinno przebiegać normalnie. Jeśli
ten argument jest prawdziwy (np. obiekt Error), wówczas przetwarzanie żądania zostaje zatrzymane,
wysłane do celu.
Drugi parametr przekazuje dane żądania do następnej funkcji w łańcuchu. Jeśli nie
dodatkowe przetwarzanie, dane żądania są przekazywane bez zmian do miejsca docelowego interfejsu API.
Możesz jednak w ramach tej metody zmodyfikować dane żądania i przekazać zmodyfikowane
do grupy docelowej. Jeśli np. dane żądania są w formacie XML, a obiekt docelowy oczekuje kodu JSON,
możesz dodać do metody ondata_request()
kod, który (a) zmieni wartość
Content-Type nagłówka żądania na application/json
i konwertuje dane żądania
w formacie JSON, w dowolny sposób (możesz na przykład użyć środowiska Node.js
konwertera xml2json uzyskanego z NPM).
Zobaczmy, jak mogłoby to wyglądać:
ondata_request: function(req, res, data, next) { debug('****** plugin ondata_request'); var translated_data = parser.toJson(data); next(null, translated_data); },
W tym przypadku dane żądania (przyjmowane jako XML) są konwertowane do formatu JSON, a tag
przekształcone dane są przekazywane przez next()
do następnej funkcji w łańcuchu żądań,
przed przekazaniem do miejsca docelowego backendu.
Pamiętaj, że możesz dodać kolejną instrukcję debugowania, aby wydrukować przekształcone dane na potrzeby debugowania. w celach informacyjnych. Na przykład:
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); },
Informacje kolejność wykonania modułu obsługi wtyczki
Jeśli piszesz wtyczki do Edge Microgateway, musisz wiedzieć, w jakiej kolejności są wykonywane moduły obsługi zdarzeń.
Należy pamiętać, że określając sekwencję wtyczki w przeglądarce Edge konfiguracji Microgateway, moduły obsługi żądań są wykonywane w kolejności rosnącej, a moduły obsługi odpowiedzi są wykonywane w kolejności malejącej.
Poniższy przykład ma pomóc w zrozumieniu tej sekwencji wykonywania.
1. Utwórz 3 proste wtyczki
Przyjrzyjmy się wtyczce poniżej. Generuje tylko dane wyjściowe konsoli, gdy jej moduły obsługi zdarzeń pod tytułem
Wtyczka/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); } }; }
Rozważ utworzenie jeszcze 2 wtyczek: plugin-2
i plugin-3
, z zastosowaniem
ten sam kod (ale zmień instrukcje console.log()
na plugin-2
i plugin-3
).
2. Sprawdź kod wtyczki
Wyeksportowana wtyczka działa w
<microgateway-root-dir>/plugins/plugin-1/index.js
to moduły obsługi zdarzeń, które
są wykonywane w określonych momentach podczas przetwarzania żądań i odpowiedzi. Przykład:
Funkcja onrequest
wykonuje pierwszy bajt nagłówka żądania. Ale
Funkcja onend_response
jest wykonywana po otrzymaniu ostatniego bajtu danych odpowiedzi.
Spójrz na moduł obsługi ondata_response – jest on wywoływany za każdym razem, gdy fragment danych odpowiedzi . Pamiętaj, że dane odpowiedzi nie zawsze są dostarczane w całości raz. Dane mogą być pobierane we fragmentach o dowolnej długości.
3. Dodaj wtyczki do sekwencja wtyczki
Kontynuując ten przykład, dodamy wtyczki do sekwencji wtyczek w Edge.
pliku konfiguracyjnego Microgateway (~./edgemicro/config.yaml
) w następujący sposób. Sekwencja jest
są ważne. Określa kolejność wykonywania modułów obsługi wtyczek.
plugins: dir: ../plugins sequence: - plugin-1 - plugin-2 - plugin-3
4. Sprawdzanie danych wyjściowych debugowania
Spójrzmy teraz na dane wyjściowe, które zostałyby wygenerowane po wywołaniu tych wtyczek. Istnieją warto zwrócić uwagę na kilka ważnych kwestii:
- Wtyczka sekwencja pliku konfiguracyjnego Edge Microgateway
(
~./edgemicro/config.yaml
) określa kolejność, w jakiej moduły obsługi zdarzeń są . - Moduły obsługi żądań są wywoływane w kolejności rosnącej (w kolejności, w jakiej są pojawiają się w sekwencji wtyczki – 1, 2, 3).
- Moduły obsługi odpowiedzi są wywoływane w kolejności malejącej – 3, 2, 1.
- Moduł obsługi
ondata_response
jest wywoływany raz dla każdego fragmentu danych, który przyjeżdża. W tym przykładzie (dane wyjściowe pokazane poniżej) odbierają 2 fragmenty.
Oto przykładowe dane wyjściowe debugowania, które są generowane, gdy te 3 wtyczki są używane i wysyłane jest żądanie za pomocą Edge Microgateway. Zwróć tylko uwagę na kolejność wywoływania modułów obsługi:
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
Podsumowanie
Poznanie kolejności wywoływania modułów obsługi wtyczek jest bardzo ważne wdrożyć niestandardowe funkcje wtyczki, takie jak zbieranie i przekształcanie żądań lub odpowiedzi; i skalowalnych danych.
Pamiętaj tylko, że moduły obsługi żądań są wykonywane w kolejności, w której są uruchamiane wtyczki określone w pliku konfiguracyjnym Edge Microgateway, a moduły obsługi odpowiedzi są wykonywane w w odwrotnej kolejności.
Informacje o używaniu zmiennych globalnych we wtyczkach
Każde żądanie do Edge Microgateway jest wysyłane do tej samej instancji wtyczki. w związku z tym stan drugiego żądania od innego klienta zastąpi pierwsze. Jedynym bezpiecznym miejscem i zapisanie stanu wtyczki polega na zapisaniu stanu we właściwości w obiekcie żądania lub odpowiedzi (którym okres ważności jest ograniczony do okresu żądania).
Przepisywanie docelowych adresów URL we wtyczce
Dodano w wersji 2.3.3
Możesz dynamicznie zastąpić domyślny docelowy URL we wtyczce, modyfikując te zmienne w kodzie wtyczki: req.targetHostname i req.targetPath.
Dodano w wersji 2.4.x
Możesz też zastąpić docelowy port punktu końcowego i wybrać HTTP lub HTTPS. Zmień te w kodzie wtyczki: req.targetPort oraz req.targetSecure. Aby wybrać HTTPS, ustaw parametr req.targetSecure na true; dla HTTP, ustaw wartość false. Jeśli ustawisz req.targetSecure na true, obejrzyj tę dyskusję .
Przykładowe wtyczki
Te wtyczki są dostarczane wraz z instalacją Edge Microgateway. Znajdziesz je w Tutaj możesz zainstalować Edge Microgateway:
[prefix]/lib/node_modules/edgemicro/plugins
gdzie [prefix]
to katalog z prefiksem npm
jako
opisane w sekcji „Gdzie jest zainstalowana Edge Microgateway” w instalacji Edge
Microgateway.
accumulate-request
Ta wtyczka gromadzi fragmenty danych z klienta do właściwości tablicy dołączonej do obiektu żądania. Po otrzymaniu wszystkich danych żądania tablica jest połączona z buforem. który jest następnie przekazywany do następnej wtyczki w sekwencji. Ta wtyczka powinna być pierwszą wtyczką w sekwencji, tak aby kolejne wtyczki otrzymywały dane dotyczące żądań.
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
Ta wtyczka gromadzi fragmenty danych ze środowiska docelowego do właściwości tablicy dołączonej do obiektu odpowiedzi. Po otrzymaniu wszystkich danych odpowiedzi tablica jest połączona z buforem który jest następnie przekazywany do następnej wtyczki w sekwencji. Ponieważ ta wtyczka działa na przetwarzanych w odwrotnej kolejności, należy umieścić je jako ostatnią wtyczkę w kolejności.
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); } }; }
wtyczka z nagłówkiem „uppercase”
Rozkłady Edge Microgateway zawierają przykładową wtyczkę o nazwie
<microgateway-root-dir>/plugins/header-uppercase
Przykład zawiera komentarze
który zawiera opis każdego z modułów obsługi funkcji. W tym przykładzie przeprowadzamy proste przekształcenie danych funkcji
i dodaje niestandardowe nagłówki do żądania klienta i odpowiedzi docelowej.
Oto kod źródłowy dla
<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(); } }; }
przekształcanie wielkie litery
To ogólna wtyczka przekształcająca, którą można zmodyfikować, aby uzyskać według własnego uznania. Ten przykład po prostu przekształca odpowiedź i dane żądania na wielkimi literami.
*/ 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); } }; }