Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację
Apigee X. informacje.
Edge Microgateway wer. 3.3.x
Odbiorcy
Ten temat jest przeznaczony dla programistów, którzy chcą rozwijać funkcje Edge Microgateway przez tworzenie niestandardowych wtyczek. Jeśli chcesz napisać nową wtyczkę, musisz znać język JavaScript 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 Edge Microgateway, dzięki czemu można je wykrywać i uruchamiać automatycznie. Podczas instalacji Edge Microgateway dostępnych jest kilka wstępnie zdefiniowanych wtyczek. Obejmują one wtyczki do uwierzytelniania, zatrzymywania skoków, limitu i analizy. Opis tych istniejących wtyczek znajdziesz w sekcji Korzystanie z wtyczek.
Możesz dodawać do mikrobramy nowe funkcje i możliwości, tworząc niestandardowe wtyczki. Domyślnie Edge Microgateway to w zasadzie bezpieczny przekazujący serwer proxy, który przekazuje żądania i odpowiedzi w niezmienionej postaci do usług docelowych i z nich. Za pomocą niestandardowych wtyczek możesz programowo wchodzić w interakcje z żądaniami i odpowiedziami, które przechodzą przez mikrobramkę.
Gdzie umieścić niestandardowy kod wtyczki
Folder z niestandardowymi wtyczkami jest dołączony do instalacji Edge Microgateway:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix]
to katalog prefiksu npm
zgodnie z opisem w sekcji „Gdzie zainstalowano Edge Microgateway” w artykule Instalowanie Edge Microgateway.
Możesz zmienić domyślny katalog wtyczek. Zobacz, gdzie znaleźć wtyczki.
Sprawdzanie wstępnie zdefiniowanych wtyczek
Zanim zaczniesz tworzyć własną wtyczkę, sprawdź, czy żadna z wstępnie zdefiniowanych wtyczek nie spełnia Twoich wymagań. Te wtyczki znajdują się tutaj:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
gdzie [prefix]
to katalog prefiksów npm
. Zobacz też sekcję „Gdzie zainstalowano Edge Microgateway” w artykule Instalowanie Edge Microgateway.
Więcej informacji znajdziesz w artykule o wstępnie zdefiniowanych wtyczkach dostarczanych przez Edge Microgateway.
Pisanie prostej wtyczki
W tej sekcji omówimy kroki niezbędne do utworzenia prostej wtyczki. 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 katalogu niestandardowej wtyczki:cd [prefix]/lib/node_modules/edgemicro/plugins
gdzie
[prefix]
to katalog prefiksunpm
zgodnie z opisem w sekcji „Gdzie zainstalowano Edge Microgateway” artykułu 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 Return, 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"); } }; }
- Masz już utworzoną wtyczkę 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ływanie interfejsu API przez Edge Microgateway. (To wywołanie interfejsu API zakłada, że masz ustawioną tę samą konfigurację co w samouczku z zabezpieczeniami klucza interfejsu API, zgodnie z opisem w sekcji 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 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() we wtyczce.
- init() zwraca obiekt z modułami obsługi funkcji nazwanych, które są wywoływane, gdy w trakcie przetwarzania żądania występują określone zdarzenia.
Funkcje modułu obsługi zdarzeń
Wtyczka musi implementować niektóre lub wszystkie z tych funkcji obsługi zdarzeń. Implementacja tych funkcji zależy od Ciebie. Każda funkcja jest opcjonalna, a typowa wtyczka wdroży przynajmniej podzbiór 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
onrequest
funkcja
Wywoływane 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 żądania, adresu URL, parametrów zapytania i metody HTTP. Jeśli wywołasz następną metodę z prawdziwym pierwszym argumentem (np. wystąpieniem 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 żądanie danych do następnej wtyczki w sekwencji wtyczki. Wartość zwrócona z ostatniej wtyczki w sekwencji jest wysyłana do środowiska docelowego. Typowym przypadkiem użycia opisanym poniżej jest przekształcenie danych żądania przed ich wysłaniem do środowiska 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 przypadkach, gdy połączenie z klientem jest zawodne. Jest ona 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ł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ł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żyć tej funkcji w przypadkach, gdy połączenie docelowe jest zawodne. 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, które występują, 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łać wywołanie zwrotne next(). Jeśli nie wywołasz funkcji next(), przetwarzanie zostanie zatrzymane, a żądanie zostanie zawieszone.
- Pierwszy argument funkcji next() może być błędem, który doprowadzi do zakończenia przetwarzania żądania.
- Moduły obsługi ondata_ i onend_ muszą wywołać metodę next() z drugim argumentem zawierającym dane, które mają zostać przekazane do celu lub klienta. Ten argument może mieć wartość null, jeśli wtyczka buforuje i nie ma wystarczającej ilości danych do przekształcenia.
- Pamiętaj, że do obsługi wszystkich żądań i odpowiedzi wtyczki służy jedna instancja. Jeśli wtyczka chce zachować stan każdego żądania między wywołaniami, może zapisać ten stan w właściwości 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ć funkcję next() z błędem. Nieudane wywołanie funkcji next() może spowodować 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ę w przypadku wyczerpania pamięci.
- Uważaj, aby postępować zgodnie z modelem 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
Dane konfiguracji uzyskane przez scalenie pliku konfiguracji Edge Microgateway z danymi pobranymi z Apigee Edge są umieszczane w obiekcie o nazwie config
.
Aby dodać do wtyczki response-override parametr konfiguracji o nazwie param o wartości foo, umieść ten parametr w pliku default.yaml
:
response-override: param: foo
Następnie możesz uzyskać dostęp do parametru w kodzie wtyczki 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 pojawi się parametr foo:
Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo
Dostęp do scalonej konfiguracji mikrobramy i pobranych danych Apigee Edge możesz uzyskać w obiekcie podrzędnym config.emgConfigs
. Dane konfiguracji możesz np. uzyskać w funkcji init
w ten sposób:
module.exports.init = function(config, logger, stats) { let emgconfigs = config.emgConfigs;
Poniżej znajdziesz przykład danych, 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: [] }
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 przechowujący liczbę żądań, odpowiedzi i błędów oraz inne statystyki zbiorcze dotyczące żądań i odpowiedzi przechodzących przez instancję mikrobramy.
- treqErrors – liczba żądań docelowych z błędami.
- treqErrors – liczba odpowiedzi docelowych z błędami.
- statusCodes – obiekt zawierający kody 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). W cyklu życia żądania pierwszą wywoływaną metodą jest onrequest(). Kolejna wywoływana metoda to ondata_request()
; jednak metoda ondata_request
jest wywoływana tylko wtedy, gdy żądanie zawiera dane, tak jak w przypadku żądania 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 w razie potrzeby pozwalają je naprawić za pomocą niestandardowego kodu.
Załóżmy, że dane są wysyłane w żądaniu, a funkcja ondata_request()
jest wywoływana. Zwróć uwagę, że funkcja wywołuje funkcję 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 następnie obsłużyć w kolejnej funkcji łańcucha. Gdy ustawisz wartość null
, czyli fałszywy argument, nie ma błędów i przetwarzanie żądań powinno przebiegać normalnie. Jeśli ten argument jest zgodny z prawdą (np. obiekt Błąd), przetwarzanie żądania zatrzyma się, a żądanie zostanie wysłane do elementu docelowego.
Drugi parametr przekazuje dane żądania do następnej funkcji w łańcuchu. Jeśli nie będziesz wykonywać dodatkowego przetwarzania, dane żądania będą przekazywane bez zmian do miejsca docelowego interfejsu API.
Możesz jednak zmodyfikować dane żądania w tej metodzie i przekazać zmodyfikowane żądanie do środowiska docelowego. Jeśli na przykład dane żądania są zapisane w formacie XML, a cel wymaga kodu 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).
Oto 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 (przyjmowane jako XML) są konwertowane do formatu JSON, a przekształcone dane są przekazywane przez next()
do następnej funkcji w łańcuchu żądań, zanim zostaną przekazane do miejsca docelowego backendu.
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 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ąco.
Poniższy przykład pomoże Ci zrozumieć kolejność wykonania kodu.
1. Utwórz 3 proste wtyczki
Rozważ tę wtyczkę. Działa tylko na danych wyjściowych konsoli, gdy jej moduły obsługi zdarzeń zostaną wywołane:
Wtyczki/wtyczka-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
z tym samym kodem (z wyjątkiem zmiany instrukcji console.log()
na odpowiednio plugin-2
i plugin-3
).
2. Sprawdzanie kodu wtyczki
Wyeksportowane funkcje wtyczek w zadaniu <microgateway-root-dir>/plugins/plugin-1/index.js
to moduły obsługi zdarzeń, które uruchamiają się w określonych momentach podczas przetwarzania żądań i odpowiedzi. Na przykład onrequest
wykonuje pierwszy bajt otrzymanych nagłówków żądań. Natomiast onend_response
jest wykonywany po otrzymaniu 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ć przesyłane od razu w całości. Dane mogą być natomiast odbierane jako fragmenty o dowolnej długości.
3. Dodaj wtyczki do sekwencji wtyczek
W dalszej części 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 wtyczki.
plugins: dir: ../plugins sequence: - plugin-1 - plugin-2 - plugin-3
4. Sprawdzanie danych wyjściowych debugowania
Przyjrzyjmy się teraz wynikom, które byłyby generowane po wywołaniu tych wtyczek. Pamiętaj o kilku ważnych kwestiach:
- Sekwencja wtyczki 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 takiej kolejności, w jakiej występują w sekwencji wtyczek – 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 odebranego fragmentu danych. W tym przykładzie (dane wyjściowe pokazane poniżej) otrzymują 2 fragmenty.
Poniżej znajdziesz 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 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 przy implementowaniu niestandardowych funkcji wtyczki, takich jak zbieranie i przekształcanie danych żądań lub odpowiedzi.
Pamiętaj tylko, że moduły obsługi żądań są wykonywane w kolejności, w której wtyczki są określone 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 do Edge Microgateway jest wysyłane do tej samej instancji wtyczki, dlatego stan drugiego żądania z innego klienta zastąpi pierwsze. Jedynym bezpiecznym miejscem do zapisywania stanu wtyczki jest zapisanie go we właściwości w obiekcie żądania lub odpowiedzi (który jest ograniczony do czasu trwania żą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 w kodzie wtyczki te zmienne: req.targetPort i req.targetSecure. Aby wybrać HTTPS, ustaw parametr req.targetSecure na true, a w przypadku HTTP – false. Jeśli ustawisz req.targetSecure na wartość true, przeczytaj ten wątek dyskusji, aby uzyskać więcej informacji.
Usunięto w wersji 3.3.3
Przykładowa wtyczka o nazwie eurekaclient została usunięta z Edge Microgateway w wersji 3.3.3. Zobacz Informacje o wersji.
Usunięcie tej funkcji nie ma wpływu na główną funkcjonalność mikrobramy Edge ani na przepisywanie docelowych adresów URL. Na poziomie wtyczki możesz skonfigurować dynamiczne wyszukiwanie punktów końcowych i zastępować zmienne docelowe, takie jak req.targetHostname
, req.targetPath
, req.targetPort
i req.targetSecure
. Przeczytaj artykuł Przepisywanie docelowych adresów URL we wtyczkach.
Przykładowe wtyczki
Te wtyczki są dostarczane wraz z instalacją Edge Microgateway. Znajdziesz je w instalacji Edge Microgateway:
[prefix]/lib/node_modules/edgemicro/plugins
gdzie [prefix]
to katalog prefiksu npm
zgodnie z opisem w sekcji „Gdzie zainstalowano Edge Microgateway” w artykule Instalowanie Edge Microgateway.
żądanie gromadzenia danych
Ta wtyczka gromadzi fragmenty danych od klienta do właściwości tablicy dołączonej do obiektu żądania. Po otrzymaniu wszystkich żądań tablica jest łączona w buforze, który jest następnie przekazywany do następnej wtyczki w sekwencji. Powinna ona być pierwszą wtyczką w sekwencji, aby kolejne wtyczki dostawały zgromadzone dane o żądaniach.
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 ze środowiska docelowego do właściwości tablicy dołączonej do obiektu odpowiedzi. Po otrzymaniu wszystkich danych tablica jest łączona w buforze, 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 ustaw 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 przy użyciu Edge Microgateway obejmuje przykładową wtyczkę o nazwie <microgateway-root-dir>/plugins/header-uppercase
. Przykład zawiera komentarze opisujące każdy z modułów obsługi funkcji. Ten przykład przeprowadza proste przekształcenie danych odpowiedzi docelowej 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łcanie wielkiej litery
Jest to ogólna wtyczka do przekształcania, którą możesz zmodyfikować, aby przeprowadzić dowolne przekształcenie. W tym przykładzie tylko odpowiedź i żądanie danych są przekształcane na wielkie.
*/ 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); } }; }