Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
Edge Microgateway wersja 3.1.x
Odbiorcy
Ten temat jest przeznaczony dla programistów, którzy chcą rozszerzać funkcje Edge Microgateway za pomocą niestandardowych wtyczek. Jeśli chcesz napisać nową wtyczkę, musisz mieć doświadczenie z JavaScriptem i Node.js.
Czym jest niestandardowa wtyczka Edge Microgateway?
Wtyczka to moduł Node.js, który dodaje funkcje do Edge Microgateway. Moduły wtyczek mają spójny wzorzec i są przechowywane w lokalizacji znanej przez Edge Microgateway, dzięki czemu można je wykrywać i uruchamiać automatycznie. Podczas instalacji Edge Microgateway jest dostępnych kilka wstępnie zdefiniowanych wtyczek. Są to między innymi wtyczki służące do uwierzytelniania, przyspieszania zatrzymania, limitów i statystyk. Opis tych istniejących wtyczek znajdziesz w sekcji Używanie wtyczek.
Możesz dodawać do mikrobramy nowe funkcje i możliwości, tworząc niestandardowe wtyczki. Domyślnie Edge Microgateway to zasadniczo bezpieczny przekazujący serwer proxy, który przekazuje żądania i odpowiedzi niezmienione do usług docelowych i z nich. Niestandardowe wtyczki umożliwiają programową interakcję z żądaniami i odpowiedziami, które przechodzą przez mikrobramę.
Gdzie umieścić niestandardowy kod wtyczki
Folder z niestandardowymi wtyczkami jest częścią instalacji Edge Microgateway, która znajduje się tutaj:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix]
to katalog prefiksu npm
zgodnie z opisem w sekcji „Gdzie jest zainstalowana przeglądarka Edge Microgateway” w artykule Instalowanie Edge Microgateway.
Możesz zmienić ten domyślny katalog wtyczek. Zobacz, gdzie znaleźć wtyczki.
Sprawdzanie wstępnie zdefiniowanych wtyczek
Zanim spróbujesz utworzyć własną wtyczkę, warto sprawdzić, czy żadna ze wstępnie zdefiniowanych wtyczek nie spełnia Twoich wymagań. Te wtyczki znajdują się w:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix]
to katalog prefiksów npm
. Zobacz też sekcję „Gdzie jest zainstalowana Edge Microgateway” artykułu Instalowanie Edge Microgateway.
Więcej informacji znajdziesz w sekcji Wstępnie zdefiniowane wtyczki udostępniane przez Edge Microgateway.
Napisz prostą wtyczkę
W tej sekcji pokażemy, jak utworzyć prostą wtyczkę. Ta wtyczka zastępuje dane odpowiedzi (cokolwiek to jest) ciągiem „Hello, World!” i drukuje je w terminalu.
- Jeśli Edge Microgateway jest uruchomiona, zatrzymaj ją teraz:
edgemicro stop
-
cd
do niestandardowego katalogu wtyczek:cd [prefix]/lib/node_modules/edgemicro/plugins
gdzie
[prefix]
to katalog prefiksunpm
zgodnie z opisem w sekcji „Gdzie jest zainstalowana przeglądarka Edge Microgateway” w artykule Instalowanie 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:
npm init
Naciśnij kilka razy klawisz powrotu, aby zaakceptować ustawienia domyślne. - Użyj edytora tekstu, aby utworzyć nowy plik o nazwie
index.js
. - Skopiuj ten kod do aplikacji
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"); } }; }
- Wtyczka została utworzona i musisz ją dodać do konfiguracji Edge Microgateway.
Otwórz plik
$HOME/.edgemicro/[org]-[env]-config.yaml
, gdzieorg
ienv
to nazwy organizacji i środowisk Edge. - Dodaj wtyczkę
response-override
do elementuplugins:sequence
, jak pokazano poniżej.
... plugins: dir: ../plugins sequence: - oauth - response-override ...
- Ponownie uruchom Edge Microgateway.
- Wywołaj interfejs API przez Edge Microgateway. (W tym wywołaniu interfejsu API założono, że masz skonfigurowaną tę samą konfigurację jak w samouczku z zabezpieczeniami klucza interfejsu API zgodnie z opisem w sekcji Konfigurowanie i konfigurowanie Edge Microgateway:
curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo Hello, World!
Składnia wtyczki
Przykładowa wtyczka Edge Microgateway ilustruje wzorzec, którym należy przestrzegać podczas tworzenia własnych wtyczek. Kod źródłowy przykładowej wtyczki omówionej w tej sekcji znajduje się w sekcji plugins/header-uppercase/index.js.
- Wtyczki to standardowe moduły NPM z elementami
package.json
iindex.js
w folderze głównym. - Wtyczka musi wyeksportować funkcję init().
- Funkcja init() przyjmuje 3 argumenty: config, logger i stats. Te argumenty opisano w argumentach funkcji init() wtyczki.
- init() zwraca obiekt z modułami obsługi funkcji nazwanych, które są wywoływane, gdy w cyklu życia żądania występują określone zdarzenia.
Funkcje modułu obsługi zdarzeń
Wtyczka musi implementować niektóre lub wszystkie funkcje modułu obsługi zdarzeń. Implementacja tych funkcji zależy od Ciebie. Każda funkcja jest opcjonalna, a typowa wtyczka implementuje co najmniej jeden podzbiór tych funkcji.
Moduły obsługi zdarzeń przepływu żądań
Te funkcje są wywoływane ze zdarzeniami żądania w Edge Microgateway.
onrequest
ondata_request
onend_request
onclose_request
onerror_request
onrequest
funkcja
Wywoływana na początku żądania klienta. Ta funkcja jest uruchamiana, gdy Edge Microgateway otrzyma pierwszy bajt żądania. Ta funkcja zapewnia dostęp do nagłówków żądań, adresu URL, parametrów zapytania i metody HTTP. Jeśli wywołasz następny argument z prawdziwym pierwszym argumentem (takim jak wystąpienie 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(); }
ondata_request
funkcja
Wywoływana po odebraniu fragmentu danych od klienta. Przekazuje dane żądania do następnej wtyczki w sekwencji wtyczki. Zwrócona wartość z ostatniej wtyczki w sekwencji jest wysyłana do środowiska docelowego. Typowym przypadkiem użycia opisanym poniżej jest przekształcanie danych żądania przed wysłaniem ich do miejsca docelowego.
Przykład:
ondata_request: function(req, res, data, next) { debug('plugin ondata_request ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }
onend_request
funkcja
Wywoływana po odebraniu wszystkich danych żądania od klienta.
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 w przypadku, gdy połączenie z klientem jest zawodne. Jest wywoływana po zamknięciu połączenia przez gniazdo z klientem.
Przykład:
onclose_request: function(req, res, next) { debug('plugin onclose_request'); next(); }
Funkcja onerror_request
Wywoływana, jeśli wystąpił błąd podczas odbierania żądania klienta.
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 po zdarzeniach odpowiedzi w Edge Microgateway.
onresponse
ondata_response
onend_response
onclose_response
onerror_response
Funkcja onresponse
Wywoływana na początku docelowej odpowiedzi. Ta funkcja jest uruchamiana, gdy Edge Microgateway otrzyma pierwszy bajt odpowiedzi. Ta funkcja zapewnia dostęp do nagłówków odpowiedzi i kodu 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 po odebraniu fragmentu danych z celu.
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żywać tej funkcji w przypadkach, gdy połączenie docelowe jest niestabilne. Jest ona wywoływana, gdy połączenie gniazda z miejscem docelowym zostanie zamknięte.
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 docelowej odpowiedzi.
Przykład:
onerror_response: function(req, res, err, next) { debug('plugin onerror_response ' + err); next(); }
Co musisz wiedzieć o funkcjach modułu obsługi zdarzeń wtyczki
Funkcje modułu obsługi zdarzeń wtyczki są wywoływane w odpowiedzi na określone zdarzenia, gdy Edge Microgateway przetwarza dane żądanie do interfejsu API.
- Po zakończeniu przetwarzania każdy z modułów obsługi funkcji init() (ondata_request, ondata_response itp.) musi wywoływać wywołanie zwrotne next(). Jeśli nie wywołasz funkcji next(), przetwarzanie zostanie zatrzymane, a żądanie zostanie zawieszone.
- Pierwszy argument funkcji next() może zawierać błąd, który spowoduje zakończenie przetwarzania żądania.
- Moduły obsługi ondata_ i onend_ muszą wywoływać metodę next() z drugim argumentem zawierającym dane, które mają zostać przekazane do elementu docelowego lub klienta. Ten argument może mieć wartość null, jeśli wtyczka buforuje i nie ma wystarczającej ilości danych do przekształcenia.
- Zwróć uwagę, że pojedyncza instancja wtyczki jest używana do obsługi wszystkich żądań i odpowiedzi. Jeśli wtyczka chce zachować stan żądania między wywołaniami, może zapisać ten stan w usłudze dodanej do dostarczonego obiektu request (req), którego czas trwania to czas trwania wywołania interfejsu API.
- Uważaj, aby wychwycić wszystkie błędy i wywołać z nimi funkcję next(). Nieudane wywołanie metody next() spowoduje zawieszenie wywołania interfejsu API.
- Uważaj, aby nie wprowadzić wycieków pamięci, ponieważ może to wpłynąć na ogólną wydajność Edge Microgateway i spowodować jej awarię w przypadku wyczerpania pamięci.
- Uważaj, aby korzystać z modelu Node.js i nie wykonywać zadań wymagających dużej mocy obliczeniowej w wątku głównym, ponieważ może to niekorzystnie 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
Obiekt konfiguracji uzyskany po scaleniu pliku konfiguracyjnego Edge Microgateway z informacjami pobranymi z Apigee Edge, takimi jak produkty i limity. Konfigurację wtyczki znajdziesz w tym obiekcie: config.<plugin-name>
.
Aby dodać do wtyczki response-override parametr konfiguracji o nazwie param o wartości foo, umieść go w pliku default.yaml
:
response-override: param: foo
Następnie możesz uzyskać dostęp do tego parametru w kodzie wtyczki, jak w tym przykładzie:
// 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 zostanie wyświetlony tag foo:
Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo
logger
Rejestrator systemowy. Obecnie używany rejestrator eksportuje te funkcje, których obiekt może być ciągiem tekstowym, żądaniem HTTP, odpowiedzią HTTP lub wystąpieniem błędu.
info(object, message)
warn(object, message)
error(object, message)
statystyki
Obiekt zawierający liczbę żądań, odpowiedzi, błędów i inne zbiorcze statystyki dotyczące żądań i odpowiedzi przechodzących przez instancję mikrobramy.
- treqErrors – liczba żądań docelowych z błędami.
- treqErrors – liczba odpowiedzi z błędami.
- statusCodes – obiekt zawierający liczbę kodów odpowiedzi:
{ 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 – łączna liczba żądań.
- responses (odpowiedzi) – łączna liczba odpowiedzi.
- connections – liczba aktywnych połączeń docelowych.
Informacje o funkcji next()
Aby kontynuować przetwarzanie następnej metody w serii, wszystkie metody wtyczki muszą wywołać metodę next()
(w przeciwnym razie proces wtyczki się zawiesi). Pierwsza metoda wywoływana w cyklu życia żądania to onrequest(). Kolejną wywoływaną metodą jest ondata_request()
; jednak metoda ondata_request
jest wywoływana tylko wtedy, gdy żądanie zawiera dane, jak w tym przypadku, na przykład POST. Kolejna wywoływana metoda to onend_request()
, która jest wywoływana po zakończeniu przetwarzania żądania. Funkcje onerror_*
są wywoływane tylko w przypadku błędu i pozwalają wyeliminować błędy za pomocą kodu niestandardowego.
Załóżmy, że dane są wysyłane w żądaniu, a wywoływana jest funkcja ondata_request()
. Zwróć uwagę, że funkcja wywołuje next()
z 2 parametrami:
next(null, data);
Zgodnie z konwencją pierwszy parametr jest używany do przekazywania informacji o błędzie, które możesz obsłużyć w kolejnej funkcji w łańcuchu. Ustawienie fałszywego argumentu null
oznacza, że nie ma błędów i przetwarzanie żądań powinno przebiegać normalnie. Jeśli ten argument jest prawidłowy (np. jest obiektem błędu), przetwarzanie żądania zatrzymuje się, a żądanie jest wysyłane do celu.
Drugi parametr przekazuje dane żądania do następnej funkcji w łańcuchu. Jeśli nie wykonasz dodatkowego przetwarzania, dane żądania zostaną przekazane w niezmienionej postaci do celu interfejsu API.
Możesz jednak zmodyfikować dane żądania w tej metodzie i przekazać zmodyfikowane żądanie do środowiska docelowego. Jeśli np. dane żądania mają format XML, a cel oczekuje w formacie JSON, możesz dodać do metody ondata_request()
kod, który (a) zmienia wartość Content-Type nagłówka żądania na application/json
i konwertuje dane żądania na format JSON w dowolny sposób (możesz np. użyć konwertera Node.js xml2json uzyskanego z NPM).
Spójrzmy, jak to może 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 (które powinny mieć format XML) są konwertowane do formatu JSON, a przekształcone dane są przekazywane przez funkcję next()
do następnej funkcji w łańcuchu żądań, zanim trafią do celu backendu.
Pamiętaj, że możesz dodać kolejną instrukcję debugowania, aby wydrukować przekształcone dane na potrzeby debugowania. 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 o zamówieniu wykonania modułu obsługi wtyczek
Jeśli piszesz wtyczki dla Edge Microgateway, musisz wiedzieć, w jakiej kolejności są wykonywane moduły obsługi zdarzeń wtyczki.
Pamiętaj, że jeśli określisz sekwencję wtyczki w pliku konfiguracyjnym Edge Microgateway, moduły obsługi żądań będą wykonywane w kolejności rosnącej, a moduły obsługi odpowiedzi – w kolejności malejąco.
Poniższy przykład pomoże Ci zrozumieć tę sekwencję wykonania.
1. Utwórz 3 proste wtyczki
Przyjrzyj się tej wtyczce. Służy tylko do drukowania danych wyjściowych konsoli, gdy ich moduły obsługi zdarzeń są wywoływane:
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); } }; }
Teraz zastanów się nad utworzeniem 2 dodatkowych wtyczek, plugin-2
i plugin-3
, o tym samym kodzie (z wyjątkiem zmiany instrukcji console.log()
na odpowiednio plugin-2
i plugin-3
).
2. Sprawdź kod wtyczki
Wyeksportowane funkcje wtyczek 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. Na przykład onrequest
wykonuje pierwszy bajt otrzymanych nagłówków żądań. Natomiast onend_response
uruchamia się po odebraniu ostatniego bajtu danych odpowiedzi.
Spójrz na moduł obsługi ondata_response, który jest wywoływany za każdym razem, gdy otrzyma fragment danych odpowiedzi. Pamiętaj, że dane odpowiedzi nie muszą być odbierane w całości od razu. Dane mogą być odbierane w porcjach o dowolnej długości.
3. Dodaj wtyczki do sekwencji wtyczek
W ramach tego przykładu dodamy wtyczki do sekwencji wtyczek w pliku konfiguracyjnym Edge Microgateway (~./edgemicro/config.yaml
) w następujący sposób. Sekwencja jest ważna. Określa kolejność wykonywania modułów obsługi wtyczek.
plugins: dir: ../plugins sequence: - plugin-1 - plugin-2 - plugin-3
4. Sprawdzanie wyników debugowania
Przyjrzyjmy się teraz danym wyjściowym generowanym po wywołaniu tych wtyczek. Oto kilka ważnych kwestii:
- Sekwencja wtyczek w pliku konfiguracyjnym Edge Microgateway (
~./edgemicro/config.yaml
) określa kolejność wywoływania modułów obsługi zdarzeń. - Moduły obsługi żądań są wywoływane w kolejności rosnącej (w kolejności, w jakiej pojawiają się w sekwencji wtyczek – 1, 2, 3).
- Moduły obsługi odpowiedzi są wywoływane w kolejności malejącej – od 3, 2, 1.
- Moduł obsługi
ondata_response
jest wywoływany raz na każdy przychodzący fragment danych. W tym przykładzie (dane wyjściowe widoczne poniżej) odbierane są 2 fragmenty.
Oto przykładowe dane wyjściowe debugowania wyświetlane, gdy te 3 wtyczki są używane, a żądanie jest wysyłane przez Edge Microgateway. Zwróć uwagę na kolejność ich wywoływania:
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
Zrozumienie kolejności wywoływania modułów obsługi wtyczek jest bardzo ważne, gdy próbujesz zaimplementować niestandardowe funkcje wtyczki, takie jak zbieranie i przekształcanie danych żądań lub odpowiedzi.
Pamiętaj tylko, że moduły obsługi żądań są wykonywane w kolejności określonej w pliku konfiguracyjnym Edge Microgateway, a moduły obsługi odpowiedzi – w odwrotnej kolejności.
Informacje o używaniu zmiennych globalnych we wtyczkach
Każde żądanie wysyłane do Edge Microgateway jest wysyłane do tej samej instancji wtyczki, dlatego drugie żądanie z innego klienta zastąpi pierwsze. Jedynym bezpiecznym miejscem do zapisywania stanu wtyczki jest przechowywanie stanu w usłudze w obiekcie żądania lub odpowiedzi (który czas życia jest ograniczony do czasu żądania).
Przepisywanie docelowych adresów URL we wtyczkach
Dodano w wersji 2.3.3
Możesz dynamicznie zastąpić domyślny docelowy URL we wtyczce, modyfikując w kodzie wtyczki te zmienne: req.targetHostname i req.targetPath.
Dodano w wersji 2.4.x
Możesz też zastąpić port docelowego punktu końcowego i wybrać HTTP lub HTTPS. Zmodyfikuj te zmienne w kodzie wtyczki: req.targetPort i req.targetSecure. Aby wybrać protokół HTTPS, ustaw req.targetSecure na wartość true, a w przypadku HTTP ustaw na false. Jeśli ustawisz req.targetSecure na wartość true, przeczytaj ten wątek dyskusji, aby uzyskać więcej informacji.
Przykładowe wtyczki
Te wtyczki są dostarczane z instalacją Edge Microgateway. Znajdziesz je w instalacji Edge Microgateway tutaj:
[prefix]/lib/node_modules/edgemicro/plugins
gdzie [prefix]
to katalog prefiksu npm
zgodnie z opisem w sekcji „Gdzie jest zainstalowana przeglądarka Edge Microgateway” w artykule Instalowanie Edge Microgateway.
żądanie skumulowania
Ta wtyczka gromadzi fragmenty danych od klienta do właściwości tablicy dołączonej do obiektu żądania. Po otrzymaniu wszystkich danych żądania tablica jest łączona do bufora, który jest następnie przekazywany do następnej wtyczki w sekwencji. Powinna ona być pierwszą wtyczką w sekwencji, aby kolejne wtyczki mogły otrzymywać zgromadzone dane żą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); } }; }
kumuluj-odpowiedź
Ta wtyczka gromadzi fragmenty danych z miejsca docelowego do właściwości tablicy dołączonej do obiektu odpowiedzi. Po otrzymaniu wszystkich danych odpowiedzi tablica jest łączona do bufora, który jest następnie przekazywany do następnej wtyczki w sekwencji. Ta wtyczka działa na odpowiedziach przetwarzanych w odwrotnej kolejności, dlatego musisz umieścić ją jako ostatnią wtyczkę w sekwencji.
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 „header-uppercase”
Dystrybucja Edge Microgateway zawiera przykładową wtyczkę o nazwie <microgateway-root-dir>/plugins/header-uppercase
. Przykład zawiera komentarze opisujące każdy moduł obsługi funkcji. W tym przykładzie przeprowadzamy proste przekształcenie danych docelowej odpowiedzi oraz dodaje niestandardowe nagłówki do żądania klienta i odpowiedzi docelowej.
Oto kod źródłowy witryny <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łcaj wielkie litery
Jest to ogólna wtyczka do przekształcania, którą można modyfikować pod kątem dowolnego rodzaju przekształcenia. W tym przykładzie po prostu przekształcamy odpowiedź i dane żądań, używając wielkich liter.
*/ 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); } }; }