Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info
Edge Microgateway w wersji 3.2.x
Odbiorcy
Ten temat jest przeznaczony dla deweloperów, którzy chcą rozszerzyć funkcje Edge Microgateway, pisząc wtyczki niestandardowe. Jeśli chcesz napisać nową wtyczkę, musisz znać język JavaScript i środowisko Node.js.
Co to jest wtyczka niestandardowa 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 Edge Microgateway, co umożliwia ich automatyczne wykrywanie i uruchamianie. Podczas instalowania Edge Microgateway udostępnianych jest kilka predefiniowanych wtyczek. Obejmują one wtyczki do uwierzytelniania, ograniczania nagłych wzrostów ruchu, limitów i analizy. Dostępne wtyczki opisano w artykule Korzystanie z wtyczek.
Możesz dodawać nowe funkcje i możliwości do mikrobramy, pisząc własne wtyczki. Domyślnie Edge Microgateway to w zasadzie bezpieczny serwer proxy typu pass-through, który przekazuje żądania i odpowiedzi bez zmian do i z usług docelowych. Dzięki wtyczkom niestandardowym możesz programowo wchodzić w interakcje z żądaniami i odpowiedziami przepływającymi przez mikrobramę.
Gdzie umieścić kod wtyczki niestandardowej
Folder wtyczek niestandardowych jest częścią instalacji Edge Microgateway. Znajduje się on w tym miejscu:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix] to katalog prefiksu npm zgodnie z opisem w sekcji „Gdzie jest zainstalowana usługa 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 opracować własną wtyczkę, sprawdź, czy żadna z predefiniowanych wtyczek nie spełnia Twoich wymagań. Te wtyczki znajdują się w:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix] to katalog z prefiksem npm. Zobacz też sekcję „Gdzie jest zainstalowana usługa Edge Microgateway” w artykule Instalowanie usługi Edge Microgateway.
Więcej informacji znajdziesz też w artykule Wstępnie zdefiniowane wtyczki udostępniane z Edge Microgateway.
Napisz prostą wtyczkę
W tej sekcji omówimy kroki wymagane do utworzenia prostego wtyczki. Ta wtyczka zastępuje dane odpowiedzi (niezależnie od tego, jakie są) ciągiem znaków „Hello, World!” i wyświetla go w terminalu.
- Jeśli Edge Microgateway jest uruchomiona, zatrzymaj ją:
edgemicro stop
-
cddo katalogu wtyczek niestandardowych:cd [prefix]/lib/node_modules/edgemicro/pluginsgdzie
[prefix]tonpmkatalog prefiksu zgodnie z opisem w sekcji „Gdzie jest zainstalowana usługa Edge Microgateway” w instalacji Edge Microgateway. - Utwórz nowy projekt wtyczki o nazwie response-override i
cddo niego:
mkdir response-override && cd response-override
- Utwórz nowy projekt Node.js:
Naciśnij klawisz Return kilka razy, aby zaakceptować ustawienia domyślne.npm init
- W edytorze tekstu utwórz nowy plik o nazwie
index.js. - Skopiuj ten kod do pliku
index.jsi zapisz go.
'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. Teraz musisz dodać ją do konfiguracji Edge Microgateway.
Otwórz plik
$HOME/.edgemicro/[org]-[env]-config.yaml, gdzieorgienvto nazwy organizacji i środowiska Edge. - Dodaj wtyczkę
response-overridedo elementuplugins:sequence, jak pokazano poniżej.
... plugins: dir: ../plugins sequence: - oauth - response-override ... - Ponownie uruchom Edge Microgateway.
- Wywoływanie interfejsu API za pomocą Edge Microgateway. (To wywołanie interfejsu API zakłada, że konfiguracja jest taka sama jak w samouczku dotyczącym zabezpieczeń klucza interfejsu API, zgodnie z opisem w artykule Konfigurowanie Edge Microgateway:
curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo Hello, World!
Składnia wtyczki
Poniższy przykładowy wtyczka Edge Microgateway ilustruje wzorzec, którego należy przestrzegać podczas tworzenia własnych wtyczek. Kod źródłowy przykładowej wtyczki omówionej w tej sekcji znajduje się w plugins/header-uppercase/index.js.
- Wtyczki to standardowe moduły NPM z plikami
package.jsoniindex.jsw folderze głównym. - Wtyczka musi eksportować funkcję init().
- Funkcja init() przyjmuje 3 argumenty: config, logger i stats. Te argumenty są opisane w sekcji Argumenty funkcji init() w klasie Plugin.
- Funkcja init() zwraca obiekt z nazwanymi procedurami obsługi funkcji, które są wywoływane, gdy w trakcie żądania wystąpią określone zdarzenia.
Funkcje modułu obsługi zdarzeń
Wtyczka musi implementować niektóre lub wszystkie z tych modułów obsługi zdarzeń. Wdrożenie tych funkcji zależy od Ciebie. Każda funkcja jest opcjonalna, a typowa wtyczka implementuje co najmniej podzbiór tych funkcji.
Moduły obsługi zdarzeń przepływu żądania
Te funkcje są wywoływane w przypadku zdarzeń żądań w Edge Microgateway.
onrequestondata_requestonend_requestonclose_requestonerror_request
onrequest funkcja
Wywoływana na początku żądania klienta. Ta funkcja jest wywoływana, gdy Edge Microgateway otrzyma pierwszy bajt żądania. Ta funkcja zapewnia dostęp do nagłówków żądania, adresu URL, parametrów zapytania i metody HTTP. Jeśli wywołasz funkcję next z pierwszym argumentem o wartości true (np. instancją 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, gdy od klienta zostanie odebrany fragment danych. Przekazuje dane żądania do następnej wtyczki w sekwencji wtyczek. Wartość zwrócona przez ostatnią wtyczkę w sekwencji jest wysyłana do miejsca docelowego. Typowym przypadkiem użycia, przedstawionym poniżej, jest przekształcenie 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, gdy wszystkie dane żądania zostały odebrane od klienta.
Przykład:
onend_request: function(req, res, data, next) { debug('plugin onend_request'); next(null, data); }
onclose_request funkcja
Wskazuje, że połączenie klienta zostało zamknięte. Tej funkcji możesz używać w przypadku, gdy połączenie klienta jest niestabilne. Jest wywoływana, gdy połączenie gniazda z klientem zostanie zamknięte.
Przykład:
onclose_request: function(req, res, next) { debug('plugin onclose_request'); next(); }
onerror_request funkcja
Wywoływana, gdy 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ń w przepływie odpowiedzi
Te funkcje są wywoływane w przypadku zdarzeń odpowiedzi w Edge Microgateway.
onresponseondata_responseonend_responseonclose_responseonerror_response
onresponse funkcja
Wywoływana na początku odpowiedzi docelowej. Ta funkcja jest wywoływana, gdy Edge Microgateway otrzyma pierwszy bajt odpowiedzi. Ta funkcja umożliwia 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(); }
ondata_response funkcja
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); }
onend_response funkcja
Wywoływana, gdy wszystkie dane odpowiedzi zostały odebrane z miejsca docelowego.
Przykład:
onend_response: function(req, res, data, next) { debug('plugin onend_response'); next(null, data); }
onclose_response funkcja
Wskazuje, że połączenie docelowe zostało zamknięte. Tej funkcji możesz używać w przypadku, gdy połączenie docelowe jest niestabilne. Jest wywoływana, gdy połączenie gniazda z elementem docelowym zostanie zamknięte.
Przykład:
onclose_response: function(req, res, next) { debug('plugin onclose_response'); next(); }
onerror_response funkcja
Wywoływana, gdy podczas odbierania odpowiedzi z usługi docelowej wystąpi błąd.
Przykład:
onerror_response: function(req, res, err, next) { debug('plugin onerror_response ' + err); next(); }
Co musisz wiedzieć o funkcjach obsługi zdarzeń wtyczki
Funkcje modułu obsługi zdarzeń wtyczki są wywoływane w odpowiedzi na określone zdarzenia, które występują podczas przetwarzania przez Edge Microgateway danego żądania do interfejsu API.
- Każdy z procedur obsługi funkcji init() (ondata_request, ondata_response itp.) musi wywoływać wywołanie zwrotne next() po zakończeniu przetwarzania. Jeśli nie wywołasz funkcji next(), przetwarzanie zostanie zatrzymane, a żądanie zawieszone.
- Pierwszym argumentem funkcji next() może być błąd, który spowoduje zakończenie przetwarzania żądania.
- Funkcje obsługi ondata_ i onend_ muszą wywoływać funkcję next() z drugim argumentem zawierającym dane, które mają być przekazywane do miejsca docelowego lub klienta. Ten argument może mieć wartość null, jeśli wtyczka buforuje dane i nie ma ich wystarczająco dużo, aby w danym momencie przeprowadzić transformację.
- 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 we właściwości dodanej do dostarczonego obiektu request (req), którego okres istnienia jest równy czasowi trwania wywołania interfejsu API.
- Uważaj, aby wychwycić wszystkie błędy, i wywołaj funkcję next() z błędem. Nieudane wywołanie funkcji 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ć awarię, jeśli zabraknie pamięci.
- Uważaj, aby postępować zgodnie z modelem Node.js i nie wykonywać zadań wymagających dużej mocy obliczeniowej w głównym wątku, 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 konfiguracyjne uzyskane przez połączenie pliku konfiguracyjnego Edge Microgateway z danymi pobranymi z Apigee Edge są umieszczane w obiekcie o nazwie config.
Aby dodać do wtyczki o nazwie response-override parametr konfiguracji o nazwie param i wartości foo, umieść w pliku default.yaml ten kod:
response-override:
param: fooNastępnie możesz uzyskać dostęp do parametru w kodzie wtyczki, np. w ten 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
Połączoną konfigurację mikrobramy i pobrane dane Apigee Edge możesz znaleźć w obiekcie podrzędnym config.emgConfigs. Możesz na przykład uzyskać dostęp do tych danych konfiguracyjnych w funkcji init w ten sposób:
module.exports.init = function(config, logger, stats) {
let emgconfigs = config.emgConfigs;
Oto przykład danych, które emgConfigs zawiera:
{
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: []
}
logger
Rejestrator systemowy. Obecnie używany rejestrator eksportuje te funkcje, gdzie obiekt może być ciągiem znaków, żądaniem HTTP, odpowiedzią HTTP lub instancją 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 innych zagregowanych statystyk związanych z żądaniami i odpowiedziami przepływającymi przez instancję mikrobramy.
- treqErrors – liczba żądań docelowych z błędami.
- treqErrors – liczba odpowiedzi docelowych 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 – łączna liczba odpowiedzi.
- connections – liczba aktywnych połączeń docelowych.
Funkcja next()
Wszystkie metody wtyczki muszą wywoływać funkcję next(), aby kontynuować przetwarzanie następnej metody w serii (w przeciwnym razie proces wtyczki zawiesi się). W cyklu życia żądania pierwszą wywoływaną metodą jest onrequest(). Następną wywoływaną metodą jest ondata_request(), ale ondata_request jest wywoływana tylko wtedy, gdy żądanie zawiera dane, np. w przypadku żądania POST. Następną wywoływaną metodą będzie onend_request(), która jest wywoływana po zakończeniu przetwarzania żądania. Funkcje onerror_* są wywoływane tylko w przypadku błędu i umożliwiają obsługę błędów za pomocą kodu niestandardowego.
Załóżmy, że w żądaniu są przesyłane dane i wywoływana jest funkcja ondata_request(). Zwróć uwagę, że funkcja wywołuje funkcję next() z 2 parametrami:
next(null, data);
Zgodnie z konwencją pierwszy parametr służy do przekazywania informacji o błędzie, które możesz następnie obsłużyć w kolejnej funkcji w łańcuchu. Ustawiając wartość null, czyli argument o wartości fałszywej, informujemy, że nie ma błędów i przetwarzanie żądania powinno przebiegać normalnie. Jeśli ten argument ma wartość prawdziwą (np. obiekt Error), przetwarzanie żądania zostanie zatrzymane, a żądanie zostanie wysłane do miejsca docelowego.
Drugi parametr przekazuje dane żądania do następnej funkcji w łańcuchu. Jeśli nie wykonasz żadnego dodatkowego przetwarzania, dane żądania zostaną przekazane bez zmian do miejsca docelowego interfejsu API.
W tej metodzie możesz jednak zmodyfikować dane żądania i przekazać zmienione żądanie do miejsca docelowego. Jeśli na przykład dane żądania są w formacie XML, a docelowy punkt końcowy oczekuje danych w formacie JSON, możesz dodać do metody ondata_request() kod, który (a) zmienia typ treści w nagłówku żądania na application/json i konwertuje dane żądania na format JSON w dowolny sposób (np. możesz użyć konwertera xml2json Node.js pobranego z NPM).
Zobaczmy, 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 (zakładamy, że są w formacie XML) są konwertowane na format JSON, a przekształcone dane są przekazywane za pomocą funkcji next() do następnej funkcji w łańcuchu żądań, a następnie do docelowego 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 kolejności wykonywania procedur obsługi wtyczek
Jeśli piszesz wtyczki do Edge Microgateway, musisz znać kolejność wykonywania modułów obsługi zdarzeń wtyczek.
Pamiętaj, że gdy określisz sekwencję wtyczek 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ącej.
Poniższy przykład pomoże Ci zrozumieć tę sekwencję wykonywania.
1. Utwórz 3 proste wtyczki
Rozważmy ten wtyczkę. W tym przypadku funkcja ta wyświetla tylko dane wyjściowe konsoli, gdy są wywoływane jej procedury obsługi zdarzeń:
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 utwórz 2 dodatkowe wtyczki, plugin-2 i plugin-3, z tym samym kodem (z wyjątkiem instrukcji console.log(), które należy zmienić odpowiednio na plugin-2 i plugin-3).
2. Sprawdzanie kodu wtyczki
Wyeksportowane funkcje wtyczki w <microgateway-root-dir>/plugins/plugin-1/index.js to procedury obsługi zdarzeń, które są wykonywane w określonych momentach podczas przetwarzania żądań i odpowiedzi. Na przykład onrequest jest wykonywane po otrzymaniu pierwszego bajta nagłówków żądania. onend_response jest wykonywane po otrzymaniu ostatniego bajta danych odpowiedzi.
Przyjrzyj się funkcji obsługi ondata_response – jest ona wywoływana za każdym razem, gdy otrzymywany jest fragment danych odpowiedzi. Ważne jest, aby pamiętać, że dane odpowiedzi niekoniecznie są odbierane w całości. Dane mogą być odbierane w blokach o dowolnej długości.
3. Dodaj wtyczki do sekwencji wtyczek
Kontynuując ten przykład, dodamy wtyczki do sekwencji wtyczek w pliku konfiguracyjnym Edge Microgateway (~./edgemicro/config.yaml) w ten sposób: Kolejność jest ważna. 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
Przyjrzyjmy się teraz wynikom, które zostaną wygenerowane po wywołaniu tych wtyczek. Pamiętaj o kilku ważnych uwagach:
- Sekwencja wtyczek w pliku konfiguracyjnym Edge Microgateway (
~./edgemicro/config.yaml) określa kolejność wywoływania procedur obsługi zdarzeń. - Obsługa żądań jest wywoływana w kolejności rosnącej (w kolejności, w jakiej występują w sekwencji wtyczki – 1, 2, 3).
- Funkcje obsługi odpowiedzi są wywoływane w kolejności malejącej – 3, 2, 1.
- Funkcja obsługi
ondata_responsejest wywoływana raz dla każdego fragmentu danych, który dociera. W tym przykładzie (wynik poniżej) otrzymano 2 bloki.
Oto przykładowe dane wyjściowe debugowania, które są generowane, gdy te 3 wtyczki są używane, a żądanie jest wysyłane przez Edge Microgateway. Zwróć uwagę na kolejność wywoływania funkcji 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
Zrozumienie kolejności wywoływania modułów obsługi wtyczek jest bardzo ważne, gdy próbujesz zaimplementować niestandardowe funkcje wtyczki, takie jak gromadzenie i przekształcanie danych żądania lub odpowiedzi.
Pamiętaj tylko, że moduły obsługi żądań są wykonywane w kolejności, w jakiej wtyczki są określone w pliku konfiguracyjnym Edge Microgateway, a moduły obsługi odpowiedzi są wykonywane w odwrotnej kolejności.
Informacje o używaniu zmiennych globalnych w pluginach
Każde żądanie do Edge Microgateway jest wysyłane do tej samej instancji wtyczki, dlatego stan drugiego żądania od innego klienta zastąpi stan pierwszego. Jedynym bezpiecznym miejscem do zapisywania stanu wtyczki jest przechowywanie go we właściwości obiektu żądania lub odpowiedzi (którego okres istnienia jest ograniczony do okresu istnienia żądania).
Przepisywanie docelowych adresów URL w przypadku wtyczek
Dodano w wersji 2.3.3
Możesz dynamicznie zastąpić domyślny docelowy adres URL w wtyczce, modyfikując te zmienne w kodzie wtyczki: req.targetHostname i req.targetPath.
Dodano w: v2.4.x
Możesz też zastąpić port docelowego punktu końcowego i wybrać protokół HTTP lub HTTPS. Zmodyfikuj te zmienne w kodzie wtyczki: req.targetPort i req.targetSecure. Aby wybrać HTTPS, ustaw wartość req.targetSecure na true. Aby wybrać HTTP, ustaw wartość false. Jeśli ustawisz wartość req.targetSecure na true, więcej informacji znajdziesz w tym wątku dyskusji.
Przykładowe wtyczki
Te wtyczki są dostarczane z instalacją Edge Microgateway. Znajdziesz je w instrukcji instalacji Edge Microgateway:
[prefix]/lib/node_modules/edgemicro/plugins
gdzie [prefix] to katalog prefiksu npm zgodnie z opisem w sekcji „Gdzie jest zainstalowana usługa Edge Microgateway” w artykule Instalowanie Edge Microgateway.
accumulate-request
Ta wtyczka gromadzi fragmenty danych z klienta w postaci właściwości tablicy dołączonej do obiektu żądania. Gdy wszystkie dane żądania zostaną odebrane, tablica jest łączona w bufor, który jest następnie przekazywany do następnej wtyczki w sekwencji. Ta wtyczka powinna być pierwszą w kolejności, aby kolejne wtyczki otrzymywały zgromadzone dane żądania.
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 z usługi docelowej w tablicy właściwości dołączonej do obiektu odpowiedzi. Gdy wszystkie dane odpowiedzi zostaną odebrane, tablica jest łączona w bufor, który jest następnie przekazywany do następnej wtyczki w sekwencji. Ta wtyczka działa na odpowiedziach, które są przetwarzane w odwrotnej kolejności, dlatego powinna być ostatnią 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
Dystrybucje Edge Microgateway zawierają przykładową wtyczkę o nazwie <microgateway-root-dir>/plugins/header-uppercase. Przykładowy kod zawiera komentarze opisujące poszczególne funkcje obsługi. Ten przykład wykonuje prostą transformację danych odpowiedzi docelowej 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(); } }; }
transform-uppercase
Jest to ogólna wtyczka do przekształceń, którą możesz zmodyfikować, aby przeprowadzać dowolne przekształcenia. Ten przykład po prostu przekształca dane odpowiedzi i żądania na wielkie litery.
*/ 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); } }; }