Tworzenie wtyczek niestandardowych

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.

  1. Jeśli Edge Microgateway jest uruchomiona, zatrzymaj ją teraz:
    edgemicro stop
    
  2. cd do katalogu niestandardowej wtyczki:

    cd [prefix]/lib/node_modules/edgemicro/plugins

    gdzie [prefix] to katalog prefiksu npm zgodnie z opisem w sekcji „Gdzie zainstalowano Edge Microgateway” artykułu Instalowanie Edge Microgateway.

  3. Utwórz nowy projekt wtyczki o nazwie response-override i cd:
    mkdir response-override && cd response-override
    
  4. Utwórz nowy projekt Node.js:
    npm init
    
    Naciśnij kilka razy klawisz Return, aby zaakceptować ustawienia domyślne.
  5. Użyj edytora tekstu, aby utworzyć nowy plik o nazwie index.js.
  6. 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");
        }
      };
    }
    
  7. Masz już utworzoną wtyczkę i musisz ją dodać do konfiguracji Edge Microgateway. Otwórz plik $HOME/.edgemicro/[org]-[env]-config.yaml, gdzie org i env to nazwy organizacji i środowisk Edge.
  8. Dodaj wtyczkę response-override do elementu plugins:sequence, jak pokazano poniżej.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. Ponownie uruchom Edge Microgateway.
  10. 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 i index.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);
    }

  };

}