Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin. bilgi
Edge Microgateway v. 3.0.x
Kitle
Bu konu, özel eklentiler yazarak Edge Microgateway özelliklerini genişletmek isteyen geliştiriciler için hazırlanmıştır. Yeni bir eklenti yazmak istiyorsanız JavaScript ve Node.js konusunda deneyimli olmanız gerekir.
Özel Edge Microgateway eklentisi nedir?
Eklentiler, Edge Microgateway'e işlevsellik ekleyen Node.js modülleridir. Eklenti modülleri tutarlı bir kalıba uyar ve Edge Microgateway tarafından bilinen bir konumda depolanır. Bu sayede otomatik olarak bulunup çalıştırılabilirler. Edge Microgateway'i yüklediğinizde önceden tanımlanmış çeşitli eklentiler sağlanır. Bunlar arasında kimlik doğrulama, ani artışları önleme, kota ve analiz için eklentiler bulunur. Mevcut eklentiler Eklentileri kullanma bölümünde açıklanmıştır.
Özel eklentiler yazarak mikro ağ geçidine yeni özellikler ve işlevler ekleyebilirsiniz. Edge Microgateway, varsayılan olarak istekleri ve yanıtları hedef hizmetlere ve hedef hizmetlerden değiştirilmeden ileten güvenli bir geçiş proxy'sidir. Özel eklentilerle, mikro ağ geçidinden geçen istek ve yanıtlarla programatik olarak etkileşim kurabilirsiniz.
Özel eklenti kodunu nereye yerleştirebilirsiniz?
Özel eklentiler için bir klasör, Edge Microgateway yüklemesinin bir parçası olarak şurada bulunur:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
Burada [prefix], Edge Microgateway'i yükleme bölümündeki "Edge Microgateway nereye yüklenir?" başlığında açıklandığı gibi npm önekli dizindir.
Bu varsayılan eklenti dizinini değiştirebilirsiniz. Eklentileri nerede bulacağınızı öğrenin.
Önceden tanımlanmış eklentileri inceleme
Kendi eklentinizi geliştirmeye çalışmadan önce, önceden tanımlanmış eklentilerden hiçbirinin gereksinimlerinizi karşılamadığını kontrol etmeniz iyi olur. Bu eklentiler şu konumda bulunur:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
Burada [prefix], npm ön eki dizinidir. Ayrıca Edge Microgateway'i yükleme başlıklı makaledeki "Edge Microgateway nereye yüklenir?" bölümüne bakın.
Ayrıntılar için Edge Microgateway ile sağlanan önceden tanımlanmış eklentiler başlıklı makaleyi de inceleyin.
Basit bir eklenti yazma
Bu bölümde, basit bir eklenti oluşturmak için gereken adımları inceleyeceğiz. Bu eklenti, yanıt verilerini (ne olursa olsun) "Hello, World!" dizesiyle geçersiz kılar ve terminale yazdırır.
- Edge Microgateway çalışıyorsa şimdi durdurun:
edgemicro stop
-
cdadlı özel eklenti dizinine:cd [prefix]/lib/node_modules/edgemicro/pluginsBurada
[prefix], Edge Microgateway'i yükleme bölümündeki "Edge Microgateway nereye yüklenir?" başlığında açıklandığı gibinpmönekli dizindir. Microgateway. - response-override adlı yeni bir eklenti projesi oluşturun ve
cdekleyin:
mkdir response-override && cd response-override
- Yeni bir Node.js projesi oluşturun:
Varsayılanları kabul etmek için Return tuşuna birkaç kez basın.npm init
index.jsadlı yeni bir dosya oluşturmak için metin düzenleyici kullanın.- Aşağıdaki kodu
index.jsdosyasına kopyalayın ve 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"); } }; }
- Artık bir eklenti oluşturdunuz ve bunu Edge Microgateway yapılandırmasına eklemeniz gerekiyor.
$HOME/.edgemicro/[org]-[env]-config.yamldosyasını açın. Buradaorgveenv, Edge kuruluşunuzun ve ortamınızın adlarıdır. response-overrideeklentisini, aşağıda gösterildiği gibiplugins:sequenceöğesine ekleyin.
... plugins: dir: ../plugins sequence: - oauth - response-override ...- Edge Microgateway'i yeniden başlatın.
- Edge Microgateway üzerinden bir API'yi çağırma. (Bu API çağrısı, Edge Microgateway'i ayarlama ve yapılandırma bölümünde açıklandığı gibi, API anahtarı güvenliğiyle ilgili olarak eğiticideki yapılandırmayla aynı yapılandırmayı ayarladığınızı varsayar:
curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo Hello, World!
Eklentinin anatomisi
Aşağıdaki Edge Microgateway örnek eklentisi, kendi eklentilerinizi geliştirirken izlemeniz gereken kalıbı gösterir. Bu bölümde ele alınan örnek eklentinin kaynak kodu, plugins/header-uppercase/index.js.
- Eklentiler, kök klasörde
package.jsonveindex.jsbulunan standart NPM modülleridir. - Eklentiler init() işlevini dışa aktarmalıdır.
- init() işlevi üç bağımsız değişken alır: config, logger ve stats. Bu bağımsız değişkenler, Plugin init() işlevinin bağımsız değişkenlerinde açıklanmıştır.
- init(), bir isteğin yaşam döngüsü sırasında belirli etkinlikler gerçekleştiğinde çağrılan adlandırılmış işlev işleyicileri içeren bir nesne döndürür.
Etkinlik işleyici işlevleri
Bir eklenti, bu etkinlik işleyici işlevlerinin bazılarını veya tümünü uygulamalıdır. Bu işlevlerin uygulanması size bağlıdır. Belirli bir işlev isteğe bağlıdır ve tipik bir eklenti bu işlevlerin en azından bir alt kümesini uygular.
İstek akışı etkinlik işleyicileri
Bu işlevlere Edge Microgateway'de istek etkinlikleri adı verilir.
onrequestondata_requestonend_requestonclose_requestonerror_request
onrequest işlev
İstemci isteğinin başında çağrılır. Bu işlev, isteğin ilk baytı Edge Microgateway tarafından alındığında tetiklenir. Bu işlev, istek başlıklarına, URL'ye, sorgu parametrelerine ve HTTP yöntemine erişmenizi sağlar. Doğru değer içeren bir ilk bağımsız değişkenle (ör. bir Error örneği) sonraki işlevi çağırırsanız istek işleme durdurulur ve 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şlev
İstemciden bir veri parçası alındığında çağrılır. İstek verilerini eklenti sırasındaki bir sonraki eklentiye iletir. Sıradaki son eklentiden döndürülen değer hedefe gönderilir. Aşağıda gösterilen tipik bir kullanım alanı, isteği hedefe göndermeden önce istek verilerini 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şlev
İstemciden tüm istek verileri alındığında çağrılır.
Örnek:
onend_request: function(req, res, data, next) { debug('plugin onend_request'); next(null, data); }
onclose_request function
İstemci bağlantısının kapatıldığını gösterir. Bu işlevi, istemci bağlantısının güvenilir olmadığı durumlarda kullanabilirsiniz. İstemciyle soket bağlantısı kapatıldığında çağrılır.
Örnek:
onclose_request: function(req, res, next) { debug('plugin onclose_request'); next(); }
onerror_request function
İstemci isteği alınırken 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'deki yanıt etkinliklerinde çağrılır.
onresponseondata_responseonend_responseonclose_responseonerror_response
onresponse function
Hedef yanıtın başında çağrılır. Bu işlev, yanıtın ilk baytı Edge Microgateway tarafından alındığında tetiklenir. Bu işlev, yanıt başlıklarına ve durum koduna erişmenizi sağlar.
Ö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
Yanıt verilerinin tamamı hedeften alındığında çağrılır.
Örnek:
onend_response: function(req, res, data, next) { debug('plugin onend_response'); next(null, data); }
onclose_response function
Hedef bağlantının kapatıldığını gösterir. Bu işlevi, hedef bağlantının güvenilir olmadığı durumlarda kullanabilirsiniz. Hedefle soket bağlantısı kapatıldığında çağrılır.
Örnek:
onclose_response: function(req, res, next) { debug('plugin onclose_response'); next(); }
onerror_response işlevi
Hedef yanıt alınırken 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 hakkında bilmeniz gerekenler
Eklenti etkinlik işleyici işlevleri, Edge Microgateway belirli bir API isteğini işlerken meydana gelen belirli etkinliklere yanıt olarak çağrılır.
- init() işlev işleyicilerinin (ondata_request, ondata_response vb.) her biri, işleme tamamlandığında next() geri çağırmasını çağırmalıdır. next() işlevini çağırmazsanız işleme durur ve istek askıda kalır.
- next() işlevinin ilk bağımsız değişkeni, istek işleme sürecinin sonlandırılmasına neden olacak bir hata olabilir.
- ondata_ ve onend_ işleyicileri, hedef veya istemciye iletilecek verileri içeren ikinci bir bağımsız değişkenle next() işlevini çağırmalıdır. Eklenti arabelleğe alıyorsa ve şu anda dönüştürmek için yeterli veriye sahip değilse bu bağımsız değişken boş olabilir.
- Tüm istek ve yanıtların işlenmesi için eklentinin tek bir örneğinin kullanıldığını unutmayın. Bir eklenti, çağrılar arasında istek başına durumu korumak istiyorsa bu durumu, sağlanan istek nesnesine (req) eklenen bir özellikte kaydedebilir. Bu özelliğin kullanım ömrü, API çağrısının süresidir.
- Tüm hataları yakalamaya ve hatayla birlikte next() işlevini çağırmaya dikkat edin. next() işlevinin çağrılmaması API çağrısının askıda kalmasına neden olur.
- Bellek sızıntılarına neden olmamaya dikkat edin. Aksi takdirde, Edge Microgateway'in genel performansı etkilenebilir ve yetersiz bellek kalırsa kilitlenebilir.
- Ana iş parçacığında yoğun olarak işlem yapılan görevleri yapmayarak Node.js modelini izlemeye dikkat edin. Aksi takdirde, Edge Microgateway'in performansı olumsuz etkilenebilir.
init() eklenti işlevi hakkında
Bu bölümde, init() işlevine iletilen bağımsız değişkenler (config, logger ve stats) açıklanmaktadır.
yapılandırma
Edge Microgateway yapılandırma dosyası ile Apigee Edge'den indirilen bilgiler (ör. ürünler ve kotalar) birleştirildikten sonra elde edilen bir yapılandırma nesnesi. Eklentiye özel yapılandırmayı şu nesnede bulabilirsiniz: config.<plugin-name>.
response-override adlı bir eklentiye foo değeriyle param adlı bir yapılandırma parametresi eklemek için default.yaml
dosyasına şunu girin:
response-override:
param: fooArdından, parametreye eklenti kodunuzda aşağıdaki gibi 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 çıkışında foo yazdırılır:
Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo
logger
Sistem kaydedici. Şu anda kullanılan günlükçü, bu işlevleri dışa aktarır. Burada nesne; dize, HTTP isteği, HTTP yanıtı veya bir hata örneği olabilir.
info(object, message)warn(object, message)error(object, message)
stats
Bir mikro ağ geçidi örneğinden geçen istekler ve yanıtlara ilişkin istek, yanıt, hata ve diğer toplu istatistiklerin sayısını içeren bir nesne.
- 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ı.
- responses: Toplam yanıt sayısı.
- connections: Etkin hedef bağlantı sayısı.
next() işlevi hakkında
Tüm eklenti yöntemleri, serideki bir sonraki yöntemin işlenmesine devam etmek için next() işlevini çağırmalıdır (aksi takdirde eklenti işlemi askıda kalır). İstek yaşam döngüsünde çağrılan ilk yöntem onrequest() olur. Çağrılacak bir sonraki yöntem ondata_request() yöntemidir. Ancak ondata_request, yalnızca istek veri içeriyorsa (ör. POST isteği) çağrılır. Bir sonraki çağrılacak yöntem, istek işleme tamamlandığında çağrılan onend_request() olacaktır. onerror_* işlevleri yalnızca hata durumunda çağrılır ve isterseniz hataları özel kodla işlemenize olanak tanır.
İstekle veri gönderildiğini ve ondata_request() çağrıldığını varsayalım. İşlevin next() işlevini iki parametreyle çağırdığını unutmayın:
next(null, data);
Genel olarak, ilk parametre hata bilgilerini iletmek için kullanılır. Bu bilgileri daha sonra zincirdeki bir işlevde işleyebilirsiniz. Bu parametreyi null (yanlış) olarak ayarlayarak hata olmadığını ve istek işlemenin normal şekilde devam etmesi gerektiğini belirtiyoruz. Bu bağımsız değişken doğruysa (ör. bir hata nesnesi) istek işleme durdurulur ve istek hedefe gönderilir.
İkinci parametre, istek verilerini zincirdeki bir sonraki işleve iletir. Başka bir işlem yapmazsanız istek verileri API'nin hedefi olan yere değiştirilmeden iletilir.
Ancak bu yöntem içinde istek verilerini değiştirme ve değiştirilen isteği hedefe iletme şansınız vardır. Örneğin, istek verileri XML ise ve hedef JSON bekliyorsa ondata_request() yöntemine (a) istek başlığının Content-Type'ını application/json olarak değiştiren ve istediğiniz herhangi bir yöntemle (örneğin, NPM'den alınan bir Node.js xml2json dönüştürücüyü kullanabilirsiniz) istek verilerini JSON'a dönüştüren kodu ekleyebilirsiniz.
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, arka uç hedefine iletilmeden önce istek zincirindeki bir sonraki işleve next() üzerinden iletilir.
Dönüştürülmüş verileri hata ayıklama amacıyla yazdırmak için başka bir hata ayıklama ifadesi ekleyebileceğinizi unutmayın. Ö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); },
Eklenti işleyici yürütme sırası hakkında
Edge Microgateway için eklentiler yazıyorsanız eklenti etkinlik işleyicilerinin yürütülme sırasını anlamanız gerekir.
Unutulmaması gereken önemli nokta, Edge Microgateway yapılandırma dosyasında bir eklenti sırası belirttiğinizde istek işleyicilerin artacak şekilde, yanıt işleyicilerin ise azalacak şekilde yürütüleceğidir.
Aşağıdaki örnek, bu yürütme sırasını anlamanıza yardımcı olmak için tasarlanmıştır.
1. Üç basit eklenti oluşturma
Aşağıdaki eklentiyi ele alalım. Bu işlev yalnızca etkinlik işleyicileri çağrıldığında konsol çıkışını yazdırır:
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); } }; }
Şimdi de aynı kodla (console.log() ifadelerini sırasıyla plugin-2 ve plugin-3 olarak değiştirmeniz gerekir) iki eklenti daha (plugin-2 ve plugin-3) oluşturmayı deneyin.
2. Eklenti kodunu inceleme
Dışa aktarılan eklenti işlevleri, <microgateway-root-dir>/plugins/plugin-1/index.js içinde istek ve yanıt işleme sırasında belirli zamanlarda yürütülen etkinlik işleyicilerdir. Örneğin,
onrequest İstek başlıklarının ilk baytı alındığında yürütülür. Bununla birlikte,
onend_response, yanıt verilerinin son baytı alındıktan sonra yürütülür.
Ondata_response işleyicisine göz atın. Bu işleyici, yanıt verilerinin bir bölümü alındığında çağrılır. Yanıt verilerinin her zaman aynı anda alınmadığını bilmeniz önemlidir. Bunun yerine, veriler rastgele uzunluktaki parçalar halinde alınabilir.
3. Eklentileri eklenti sırasına ekleyin.
Bu örneğe devam ederek eklentileri, Edge Microgateway yapılandırma dosyasındaki (~./edgemicro/config.yaml) eklenti sırasına aşağıdaki şekilde ekleyeceğiz. Sıra önemlidir. Eklenti işleyicilerinin yürütüleceği sırayı tanımlar.
plugins:
dir: ../plugins
sequence:
- plugin-1
- plugin-2
- plugin-3
4. Hata ayıklama çıkışını inceleyin
Şimdi de bu eklentiler çağrıldığında üretilecek çıkışa bakalım. Dikkat edilmesi gereken birkaç önemli nokta vardır:
- Eklenti sırası, Edge Microgateway yapılandırma dosyasında (
~./edgemicro/config.yaml) etkinlik işleyicilerinin çağrılma sırasını belirtir. - İstek işleyiciler artan sırada (eklenti dizisinde göründükleri sıra: 1, 2, 3) çağrılır.
- Yanıt işleyiciler azalan sırada (3, 2, 1) çağrılır.
ondata_responseişleyici, gelen her veri parçası için bir kez çağrılır. Bu örnekte (aşağıda gösterilen çıkış), iki parça alınır.
Bu üç eklenti kullanılırken ve Edge Microgateway üzerinden istek gönderildiğinde üretilen örnek hata ayıklama çıktısını aşağıda bulabilirsiniz. Yalnızca işleyicilerin çağrılma sırasına dikkat edin:
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şleyicilerinin çağrılma sırasını anlamak, istek veya yanıt verilerini biriktirme ve dönüştürme gibi özel eklenti işlevlerini uygulamaya çalışırken çok önemlidir.
İstek işleyicilerin, Edge Microgateway yapılandırma dosyasında eklentilerin belirtildiği sırayla, yanıt işleyicilerin ise bunun tersi bir sırayla yürütüldüğünü unutmayın.
Eklentilerde genel değişkenleri kullanma hakkında
Edge Microgateway'e yapılan her istek, bir eklentinin aynı örneğine gönderilir. Bu nedenle, başka bir istemciden gelen ikinci bir isteğin durumu, ilk isteğin durumunun üzerine yazılır. Eklenti durumunu kaydetmek için tek güvenli yer, durumu istek veya yanıt nesnesindeki bir özellikte (ömrü istekle sınırlı olan) depolamaktır.
Hedef URL'leri eklentilerde yeniden yazma
Eklendiği sürüm: 2.3.3
Eklenti kodunuzdaki req.targetHostname ve req.targetPath değişkenlerini değiştirerek bir eklentideki varsayılan hedef URL'yi dinamik olarak geçersiz kılabilirsiniz.
Eklendiği sürüm: v2.4.x
Hedef uç nokta bağlantı noktasını da geçersiz kılabilir ve HTTP ile HTTPS arasında seçim yapabilirsiniz. Eklenti kodunuzdaki req.targetPort ve req.targetSecure değişkenlerini değiştirin. HTTPS'yi seçmek için req.targetSecure değerini true olarak, HTTP'yi seçmek için ise false olarak ayarlayın. req.targetSecure değerini doğru olarak ayarlarsanız daha fazla bilgi için bu tartışma dizisine bakın.
Örnek eklentiler
Bu eklentiler, Edge Microgateway kurulumunuzla birlikte sağlanır. Bunları Edge Microgateway kurulumunda bulabilirsiniz:
[prefix]/lib/node_modules/edgemicro/plugins
Burada [prefix], Edge Microgateway'i yükleme bölümündeki "Edge Microgateway nereye yüklenir?" başlığında açıklandığı gibi npm önekli dizindir.
accumulate-request
Bu eklenti, istemciden gelen veri parçalarını istek nesnesine eklenmiş bir dizi özelliğinde toplar. Tüm istek verileri alındığında dizi, bir Buffer'a birleştirilir ve ardından sıradaki bir sonraki eklentiye iletilir. Bu eklenti, birikmiş istek verilerinin sonraki eklentilere iletilmesi için sıradaki ilk eklenti olmalıdır.
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, hedefteki veri parçalarını yanıt nesnesine eklenen bir dizi özelliğinde toplar. Tüm yanıt verileri alındığında dizi, bir arabelleğe birleştirilir ve ardından sıradaki sonraki eklentiye iletilir. Bu eklenti, ters sırada işlenen yanıtlarda çalıştığı için eklentiyi sıranın sonuna yerleştirmeniz gerekir.
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); } }; }
header-uppercase eklentisi
Edge Microgateway dağıtımları, <microgateway-root-dir>/plugins/header-uppercase adlı örnek bir eklenti içerir. Örnekte, işlev işleyicilerinin her birini açıklayan yorumlar yer alır. Bu örnek, hedef yanıtta bazı basit veri dönüşümleri yapar ve istemci isteğine ve hedef yanıta özel başlıklar ekler.
<microgateway-root-dir>/plugins/header-uppercase/index.js için kaynak kodu aşağıda verilmiştir:
'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
Bu, istediğiniz türde dönüşüm yapacak şekilde değiştirebileceğiniz genel bir dönüşüm eklentisidir. Bu örnekte, yanıt ve istek verileri yalnızca büyük harfe dönüştürülür.
*/ 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); } }; }