Özel eklentiler geliştirme

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

Edge Microgateway v. 3.0.x

Kitle

Bu konu, bir e-posta yazarak Edge Microgateway özelliklerini genişletmek isteyen geliştiricilere yöneliktir ekleyebilirsiniz. Yeni bir eklenti yazmak istiyorsanız, JavaScript ve Node.js deneyiminiz gereklidir.

Özel Edge Microgateway eklentisi nedir?

Eklentiler, Edge Microgateway'e işlev ekleyen bir Node.js modülüdür. Eklenti modülleri tutarlı bir kalıp izler ve Edge Microgateway tarafından bilinen bir konumda saklanır. otomatik olarak keşfedilmelerini sağlar. Farklı bir eklenti kullanıyorsanız Edge Microgateway'i yükleyin. Bunlar, kimlik doğrulama, artış durdurma, kota ve Analytics'ten ulaşabilirsiniz. Bu mevcut eklentiler, Eklentileri kullanma bölümünde açıklanmaktadır.

Özel etiketler yazarak mikro ağ geçidine yeni özellikler ve yetenekler ekleyebilirsiniz: ekleyebilirsiniz. Varsayılan olarak Edge Mikro Ağ Geçidi aslında bir güvenlik anahtarıdır. Hedef hizmetlere ve hizmetlerden gelen istekler ve yanıtları değiştirmeden iletir. Özel eklentilerle şunları yapabilirsiniz: bu istek ve yanıtlarla programatik olarak etkileşime girer.

Özel eklenti kodu nereye yerleştirilir?

Edge Microgateway kurulumunun parçası olarak özel eklentiler için bir klasör eklenir buradan inceleyebilirsiniz:

[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins

burada [prefix], aşağıdaki gibi npm ön ek dizinidir: "Edge Microgateway'in yüklü olduğu yerler" Edge'yi Yükleme'de Mikro ağ geçidi.

Bu varsayılan eklenti dizinini değiştirebilirsiniz. Nerede bulunur? ekleyebilirsiniz.

Önceden tanımlanmış eklentileri inceleme

Kendi eklentinizi geliştirmeye çalışmadan önce, gereksinimlerinizi karşıladığından emin olun. Bu eklentiler şurada bulunur:

[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins

Burada [prefix], npm ön ek dizinidir. Görüntüleyin ayrıca "Edge Microgateway yüklü olduğu yerler" Chrome'u Yükleme Mikro ağ geçidi.

Ayrıntılar için Önceden tanımlanmış Edge Microgateway ile sağlanan eklentiler

Basit bir eklenti yazın

Bu bölümde, basit bir eklenti oluşturmak için gereken adımları anlatacağız. Bu eklenti yanıt verilerini (her ne ise) "Hello, World!" dizesiyle geçersiz kılar ve bunu şuraya yazdırır: terminal.

  1. Edge Microgateway çalışıyorsa hemen durdurun:
    edgemicro stop
    
  2. Özel eklenti dizinine cd:

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

    burada [prefix], npm ön eki dizinidir "Edge Microgateway yüklü olduğu yerler" bölümünde açıklandığı gibi Edge'yi Yükleme'de Mikro ağ geçidi.

  3. response-override ve cd adlı yeni bir eklenti projesi oluşturun. ona:
    mkdir response-override && cd response-override
    
  4. Yeni bir Node.js projesi oluşturun:
    npm init
    
    Varsayılanları kabul etmek için Geri Dön'e birden çok kez basın.
  5. index.js adlı yeni bir dosya oluşturmak için bir metin düzenleyici kullanın.
  6. Aşağıdaki kodu index.js klasörüne kopyalayıp dosyayı kaydedin.
    '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. Şimdi bir eklenti oluşturdunuz ve bunu Edge Microgateway yapılandırmasına eklemeniz gerekiyor. org ve burada yer alan $HOME/.edgemicro/[org]-[env]-config.yaml dosyasını açın. env, Edge kuruluşunuz ve ortam adlarınızdır.
  8. response-override eklentisini plugins:sequence öğesine ekleyin aşağıda gösterildiği gibidir.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. Edge Microgateway'i yeniden başlatın.
  10. Edge Microgateway üzerinden bir API çağırın. (Bu API çağrısında, aynı anahtar/değer çifti için Kurulum sırasında açıklandığı gibi API anahtarı güvenliği içeren eğitim ve Edge Microgateway'i yapılandırma:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

Eklentinin anatomisi

Aşağıdaki Edge Microgateway örnek eklentisinde, kendi eklentilerinizi oluşturabilirsiniz. Bu bölümde açıklanan örnek eklentinin kaynak kodu: plugins/header-uppercase/index.js. içinde

  • Eklentiler, package.json ve index.js bulunan standart NPM modülleridir kök klasörde bulabilirsiniz.
  • Eklenti, init() işlevini dışa aktarmalıdır.
  • init() işlevi üç bağımsız değişken alır: config, logger ve istatistikler. Bu bağımsız değişkenler Eklenti'de açıklanmıştır init() işlevi bağımsız değişkenleri için geçerlidir.
  • init(), bir isteğin ömrü boyunca belirli olaylar gerçekleşir.

Etkinlik işleyici işlevleri

Bir eklenti, bu etkinlik işleyici işlevlerinden bazılarını veya tümünü uygulamalıdır. Bunların uygulanması seçim yapmanıza yardımcı olur. Verilen herhangi bir işlev isteğe bağlıdır ve normal bir eklenti bir alt kümesi olabilir.

İstek akışı etkinlik işleyicileri

Bu işlevler, Edge Microgateway'de istek etkinliklerinde çağrılır.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest işlevi

İstemci isteğinin başında aranır. Bu fonksiyon, dosyanın ilk baytı isteği Edge Microgateway tarafından alınır. Bu işlev, istek başlıklarına ve URL, sorgu parametreleri ve HTTP yöntemi. Bir sonraki çağrıyı doğru ilk bağımsız değişkenle (örneğin, Böylece, isteğin işlenmesi durur ve bir hedef istek başlatılmaz.

Örnek:

onrequest: function(req, res, next) {
      debug('plugin onrequest');
      req.headers['x-foo-request-start'] = Date.now();
      next();
    }

ondata_request işlevi

İstemciden bir veri parçası alındığında çağrılır. İstek verilerini sonraki ilk sıraya yerleştirin. Sıralamadaki son eklentiden döndürülen değer yardımcı olur. Aşağıda gösterilen tipik kullanım alanlarından biri, istek verilerini göndermeden önce dönüştürmektir. .

Örnek:

ondata_request: function(req, res, data, next) {
      debug('plugin ondata_request ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }

onend_request işlevi

İstemciden istek verilerinin tümü alındığında çağrılır.

Örnek:

onend_request: function(req, res, data, next) {
      debug('plugin onend_request');
      next(null, data);
    }

onclose_request işlevi

İstemci bağlantısının kapandığını belirtir. Bu işlevi, istemci bağlantısı güvenilir değil. İstemci ile olan yuva bağlantısı şu durumlarda çağrılır: kapalı.

Örnek:

onclose_request: function(req, res, next) {
      debug('plugin onclose_request');
      next();
    }

onerror_request işlevi

İstemci isteği alınırken bir hata oluşursa çağrılır.

Örnek:

onerror_request: function(req, res, err, next) {
      debug('plugin onerror_request ' + err);
      next();
    }

Yanıt akışı etkinlik işleyicileri

Bu işlevler, Edge Microgateway'de yanıt etkinliklerinde çağrılır.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

onresponse işlevi

Hedef yanıtın başında çağrıldı. Bu fonksiyon, dosyanın ilk baytı yanıtı Edge Microgateway tarafından alınır. Bu işlev, yanıt başlıklarına ve durum kodu.

Örnek:

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 işlevi

Hedeften bir veri parçası alındığında çağrılır.

Örnek:

ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }


. onend_response işlevi

Hedeften yanıt verilerinin tamamı alındığında çağrılır.

Örnek:

onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    }

onclose_response işlevi

Hedef bağlantının kapandığını belirtir. Bu işlevi, güvenilir değil. Bu, hedefe olan yuva bağlantısı şu anda kapalı.

Örnek:

onclose_response: function(req, res, next) {
      debug('plugin onclose_response');
      next();
    }


. onerror_response işlevi

Hedef yanıt alınırken bir hata oluşursa çağrılır.

Örnek:

onerror_response: function(req, res, err, next) {
      debug('plugin onerror_response ' + err);
      next();
    }

eklenti etkinlik işleyici işlevleri

Eklenti etkinlik işleyici işlevleri, Edge Microgateway, belirli bir API isteğini işler.

  • init() işlev işleyicilerinin her biri (ondata_request, ondata_response vb.) tamamlandığında, next() geri çağırmasını çağırmalıdır bahsedeceğim. next() çağrısı yapmazsanız işleme durur ve istek asılacak.
  • next() için ilk bağımsız değişken, isteğe neden olacak bir hata olabilir feshedilir.
  • ondata_ ve onend_ işleyicileri Hedefe iletilecek verileri içeren ikinci bir bağımsız değişkeni içeren next() karar vermenize yardımcı olacaktır. Eklenti arabelleğe alınıyorsa ve işlem için yeterli veri yoksa bu bağımsız değişken boş olabilir yaşandığını söyleyebiliriz.
  • Tüm isteklere ve yanıtlara hizmet vermek için eklentinin tek bir örneğinin kullanıldığını unutmayın. Bir eklenti çağrılar arasında istek başına durumu korumak isterse bu durumu bir özelliği, sağlanan request nesnesine (req) eklendi; ömür boyu API çağrısının süresidir.
  • Tüm hataları yakalamaya ve hatayla birlikte next() çağrısına dikkat edin. Başarısız next() çağrısı, API çağrısının askıya alınmasına neden olur.
  • Edge'in genel performansını etkileyebileceğinden bellek sızıntıları yaşamamaya dikkat edin Mikro ağ geçidi ve belleği tükenirse kilitlenmesine neden olur.
  • Ana makinede yoğun bilgi işlem gerektiren görevler yapmadan Node.js modelini iş parçacığı (bu, Edge Microgateway'in performansını olumsuz etkileyebilir).

Eklentinin init() işlevi hakkında

Bu bölümde, init() işlevine iletilen bağımsız değişkenler açıklanmaktadır: config, logger ve stats.

yapılandırma

Edge Microgateway yapılandırma dosyası Apigee Edge'den indirilen ürünler ve kotalar gibi bilgileri içerir. Daha fazla bu nesnedeki eklentiye özel yapılandırma: config.<plugin-name>.

foo değeriyle param adlı bir yapılandırma parametresi eklemek için response-override adlı bir eklentiye eklemek için bunu default.yaml dosya:

response-override:
    param: foo

Ardından, eklenti kodunuzdaki parametreye şu şekilde erişebilirsiniz:

// 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);
    },

Bu durumda, eklenti hata ayıklama çıktısında foo değerini görürsünüz:

Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo

logger

Sistem günlük kaydı. Kullanılmakta olan günlükçü, bu fonksiyonları dışa aktarır. bir dize, HTTP isteği, HTTP yanıtı veya Hata örneği.

  • info(object, message)
  • warn(object, message)
  • error(object, message)

stats

İstek, yanıt, hata ve diğer toplu istatistiklerin sayısını barındıran nesne Mikro ağ geçidi örneğinden geçen istekler ve yanıtlar ile ilgilidir.

  • treqErrors - Hata içeren hedef isteklerin sayısı.
  • treqErrors - Hata içeren hedef yanıtların sayısı.
  • statusCodes - Yanıt kodu sayılarını içeren bir nesne:
{
  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 - Toplam istek sayısı.
  • yanıtlar - Toplam yanıt sayısı.
  • bağlantılar: Etkin hedef bağlantıların sayısı.

next() işlevi hakkında

Tüm eklenti yöntemlerininnext() serisi (veya eklenti işlemi askıya alınır). İstek yaşam döngüsünde çağrılan ilk yöntem onrequest() işlevini kullanın. Çağrılacak bir sonraki yöntem ondata_request() yöntemidir; ancak, ondata_request, yalnızca aşağıdaki gibi veri bulunması durumunda çağrılır: bir POST isteği olabilir. Çağrılan bir sonraki yöntem onend_request(), isteğin işlenmesi tamamlandığında çağrılır. İlgili içeriği oluşturmak için kullanılan onerror_* işlevleri yalnızca hata durumunda çağrılır ve şunları yapmanıza olanak tanır: bu hataları özel kodla ele alabilirsiniz.

Verilerin istekte gönderildiğini ve ondata_request() öğesinin çağrıldığını varsayalım. Bildirim next(), iki parametreyle çağrılıyor:

next(null, data);

Kural olarak, ilk parametre hata bilgilerini aktarmak için kullanılır ve daha sonra tutma yeriyle ilgili başka bir işlevi yoktur. Bunu null değerine ayarladığınızda bir faalsy bağımsız değişkeni üzerinde herhangi bir hata olmadığını ve isteğin normal bir şekilde işlenmesi gerektiğini söylüyoruz. Eğer (Hata nesnesi gibi) bağımsız değişken doğruysa, istek işleme durur ve istek hedefe gönderilir.

İkinci parametre, istek verilerini zincirdeki bir sonraki işleve iletir. Hayır istek verileri değiştirildikten sonra API'nin hedefine iletilmez. Ancak, bu yöntemden istek verilerini değiştirme ve değiştirilen kodu iletme şansınız vardır istek üzerine çalışır. Örneğin, istek verileri XML ise ve hedef JSON bekliyorsa, o zaman ondata_request() yöntemine (a) İstek başlığının Content-Type'ı, application/json değerine ayarlanır ve istek verilerini dönüştürür kullanarak JSON'a dönüştürebilirsiniz (örneğin, bir Node.js veya NPM'den edinilen xml2json dönüştürücüsü).

Şimdi bunun nasıl görünebileceğine bakalım:

ondata_request: function(req, res, data, next) {
  debug('****** plugin ondata_request');
  var translated_data = parser.toJson(data);
  next(null, translated_data);
},

Bu durumda, istek verileri (XML olduğu varsayılır) JSON'a dönüştürülür ve dönüştürülen veriler, next() aracılığıyla istek zincirindeki bir sonraki işleve iletilir. arka uç hedefine geçirilmeden önce test edilir.

Dönüştürülen verileri hata ayıklama amacıyla yazdırmak için başka bir hata ayıklama ifadesi ekleyebileceğinizi unutmayın amaçlar. Örneğin:

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);
},

Hakkında eklenti işleyici yürütme sırası

Edge Microgateway için eklentiler yazıyorsanız eklentinin hangi sırayla etkinlik işleyicileri yürütülür.

Unutulmaması gereken önemli nokta şudur: Edge'de bir eklenti sırası belirlediğinizde Mikro ağ geçidi yapılandırma dosyası, istek işleyiciler artan sırada yürütülür, yanıt işleyiciler ise azalan sırada yürütülür.

Aşağıdaki örnek, bu yürütme sırasını anlamanıza yardımcı olmak üzere tasarlanmıştır.

1. Üç basit adım oluşturun eklentiler

Aşağıdaki eklentiyi kullanabilirsiniz. Tek yaptığı, etkinlik işleyicileri etkinken konsol çıkışıdır adı:

eklentiler/eklentiler-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);
    }
  };
}

Şimdi, tek bir eklentiyle plugin-2 ve plugin-3 olmak üzere iki eklenti daha oluşturabilirsiniz: aynı kod (console.log() ifadelerini plugin-2 olarak değiştirin) ve plugin-3) ekleyin.

2. Eklenti kodunu inceleme

Dışa aktarılan eklenti <microgateway-root-dir>/plugins/plugin-1/index.js, şu özelliklere sahip etkinlik işleyicilerdir: istek ve yanıt işleme sırasında belirli zamanlarda yürütülür. Örneğin, onrequest, alınan istek başlıklarının ilk baytını yürütür. Ancak, onend_response, yanıt verilerinin son baytı alındıktan sonra yürütülür.

ondata_response işleyicisine göz atın. Yanıt verisi parçası olduğunda çağrılır alındı. Önemli nokta, yanıt verilerinin tam olarak alınmadığıdır. bir kez. Bunun yerine, veriler rastgele uzunlukta parçalar halinde alınabilir.

3. Eklentileri şuraya ekle: eklenti sırası

Bu örnekten devam edelim. Eklentileri Edge'deki eklenti sırasına ekleyeceğiz Microgateway yapılandırma dosyası (~./edgemicro/config.yaml) aşağıdaki gibidir. Sıra önemlidir. Eklenti işleyicilerin yürütülme sırasını tanımlar.

  plugins:
    dir: ../plugins
    sequence:
      - plugin-1
      - plugin-2
      - plugin-3
  

4. Hata ayıklama çıkışını inceleme

Şimdi, bu eklentiler çağrıldığında üretilen çıkışa bakalım. Her biri 100'den az gösterim alan dikkat edilmesi gereken birkaç önemli nokta var:

  • Edge Microgateway yapılandırma dosyasının eklenti sırası (~./edgemicro/config.yaml), etkinlik işleyicilerin hangi sırayla çağrıldı.
  • İstek işleyiciler artan düzende çağrılır (sırasıyla görünür (1, 2, 3).
  • Yanıt işleyiciler azalan düzende çağrılır (3, 2, 1).
  • ondata_response işleyici, oluşturulan her veri parçası için bir kez geldiğinde. Bu örnekte (çıktı aşağıda gösterilmiştir) iki parça alınmıştır.

Bu üç eklenti kullanılırken ve bir istek gönderildiğinde üretilen örnek hata ayıklama çıkışını burada bulabilirsiniz aracılığıyla şifre oluşturabilirsiniz. İşleyicilerin çağrılma sırasına dikkat etmeniz yeterlidir:

  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

Özet

Eklenti işleyicilerin çağrıldığı sırayı anlamak, istek veya yanıtı biriktirme ve dönüştürme gibi özel eklenti işlevlerini uygulayabilirsiniz. dışı verilerdir.

İstek işleyicilerin, eklentilerin kaldırılma sırasına göre yürütüldüğünü veri işleyicileri tarafından çalıştırılan ve ters sırada.

Eklentilerde genel değişkenleri kullanma hakkında

Edge Microgateway'e yapılan her istek aynı eklenti örneğine gönderilir; Bu nedenle, başka bir istemciden gelen ikinci isteğin durumu, ilk isteğin üzerine yazılır. Projenin gidişatı boyunca "kaydet" eklentisinin durumu, durumu istek veya yanıt nesnesindeki ( kullanım ömrü isteğin süresiyle sınırlıdır.

Eklentilerdeki hedef URL'leri yeniden yazma

Eklendiği sürüm: 2.3.3 sürümü

Bir eklentideki varsayılan hedef URL'yi dinamik olarak geçersiz kılmak için bu değişkenleri değiştirerek Eklenti kodunuz: req.targetHostname ve req.targetPath.

Eklendiği sürüm: v2.4.x

Ayrıca, hedef uç nokta bağlantı noktasını geçersiz kılabilir ve HTTP ile HTTPS arasında seçim yapabilirsiniz. Bunları değiştir değişkenleri: req.targetPort ve req.targetSecure. HTTPS'yi seçmek için req.targetSecure özelliğini şu şekilde ayarlayın: true; için false (yanlış) değerine ayarlayın. req.targetSecure özelliğini true, bu tartışmaya bakın ileti dizisinde bulabilirsiniz.

eurekaclient adlı örnek bir eklenti, Edge Microgateway'e eklendi. Bu eklentisi, req.targetPort ve req.targetSecure değişkenlerinin nasıl kullanılacağını Edge Microgateway'in bir hizmet olarak Eureka'yı kullanarak dinamik uç nokta aramasını nasıl gerçekleştirebileceğini gösteriyor uç nokta kataloğu.


. Örnek eklentiler

Bu eklentiler, Edge Microgateway yüklemenizle birlikte sağlanır. Bunları Edge Microgateway yüklemesi burada:

[prefix]/lib/node_modules/edgemicro/plugins

burada [prefix], aşağıdaki gibi npm ön ek dizinidir: "Edge Microgateway'in yüklü olduğu yerler" Edge'yi Yükleme'de Mikro ağ geçidi.

accumulate-request

Bu eklenti, istemciden veri parçalarını istek nesnesini oluşturur. Tüm istek verileri alındığında dizi bir Arabellekte birleştirilir. Bu, daha sonra sıradaki eklentiye iletilir. Bu eklenti, ilk eklenti olmalıdır sıralayarak sonraki eklentilerin biriken istek verilerini almasını sağlayın.

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

Bu eklenti, hedeften gelen veri parçalarını yanıt nesnesini tanımlayın. Tüm yanıt verileri alındığında dizi bir Arabellekte birleştirilir. Bu, daha sonra sıradaki eklentiye iletilir. Bu eklenti veya ters sırada işlenen yanıtları görmek için, dosyayı son eklenti olarak yerleştirmeniz gerekir. tıklayın.

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);
    }

  };

}

başlık-büyük harf eklentisi

Edge Microgateway dağıtımları, <microgateway-root-dir>/plugins/header-uppercase Örnekte yorumlar yer alıyor tanımlayarak fonksiyon işleyicilerin her birini açıklayın. Bu örnek, JavaScript'in barındırdığı bazı basit veri dönüşümlerini ve istemci isteği ile hedef yanıta özel başlıklar ekler.

Şunun için kaynak kodu: <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();
    }

  };

}

büyük harf dönüştürme

Bu, istediğiniz türde yapmak için değiştirebileceğiniz genel bir dönüştürme eklentisidir. istediğiniz dönüşüm işlemini yapabilirsiniz. Bu örnek, yanıtı ve istek verilerini büyük harf kullanın.

 */
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);
    }

  };

}