Mengembangkan plugin kustom

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Edge Microgateway v. 3.3.x

Audiens

Topik ini ditujukan bagi developer yang ingin memperluas fitur Edge Microgateway dengan menulis plugin kustom. Jika ingin menulis plugin baru, Anda harus memiliki pengalaman dengan JavaScript dan Node.js.

Apa itu plugin Edge Microgateway kustom?

Plugin adalah modul Node.js yang menambahkan fungsi ke Edge Microgateway. Modul plugin mengikuti pola yang konsisten dan disimpan di lokasi yang dikenal oleh Edge Microgateway, sehingga memungkinkannya ditemukan dan dijalankan secara otomatis. Beberapa plugin yang telah ditetapkan sebelumnya disediakan saat Anda menginstal Edge Microgateway. Komponen tersebut mencakup plugin untuk autentikasi, penangkapan lonjakan, kuota, dan analisis. Plugin yang sudah ada ini dijelaskan di Menggunakan plugin.

Anda dapat menambahkan fitur dan kemampuan baru ke microgateway dengan menulis plugin kustom. Secara default, Edge Microgateway pada dasarnya adalah proxy pass-through yang aman yang meneruskan permintaan dan respons tanpa perubahan ke dan dari layanan target. Dengan plugin kustom, Anda dapat berinteraksi secara terprogram dengan permintaan dan respons yang mengalir melalui microgateway.

Tempat untuk menempatkan kode plugin kustom

Folder untuk plugin kustom disertakan sebagai bagian dari penginstalan Edge Microgateway di sini:

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

dengan [prefix] adalah direktori awalan npm seperti yang dijelaskan dalam "Di mana Edge Microgateway terinstal" dalam Menginstal Edge Microgateway.

Anda dapat mengubah direktori plugin default ini. Lihat Tempat menemukan plugin.

Meninjau plugin yang telah ditentukan sebelumnya

Sebelum mencoba mengembangkan plugin Anda sendiri, sebaiknya periksa bahwa tidak ada plugin yang telah ditetapkan yang memenuhi persyaratan Anda. Plugin ini berada di:

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

dengan [prefix] adalah direktori awalan npm. Lihat juga "Di mana Edge Microgateway diinstal" di Menginstal Edge Microgateway.

Untuk mengetahui detailnya, lihat juga Plugin yang telah ditetapkan sebelumnya yang disediakan dengan Edge Microgateway.

Menulis plugin sederhana

Di bagian ini, kita akan memandu langkah-langkah yang diperlukan untuk membuat plugin sederhana. Plugin ini mengganti data respons (apa pun itu) dengan string "Hello, World!" dan mencetaknya ke terminal.

  1. Jika Edge Microgateway sedang berjalan, hentikan sekarang:
    edgemicro stop
    
  2. cd ke direktori plugin kustom:

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

    dengan [prefix] adalah direktori awalan npm seperti yang dijelaskan dalam "Di mana Edge Microgateway terinstal" dalam Menginstal Edge Microgateway.

  3. Buat project plugin baru yang bernama response-override dan cd ke project tersebut:
    mkdir response-override && cd response-override
    
  4. Buat project Node.js baru:
    npm init
    
    Tekan Tampilkan beberapa kali untuk menerima default.
  5. Gunakan editor teks untuk membuat file baru bernama index.js.
  6. Salin kode berikut ke index.js, dan simpan file.
    '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. Sekarang Anda telah membuat plugin, dan perlu menambahkannya ke konfigurasi Edge Microgateway. Buka file $HOME/.edgemicro/[org]-[env]-config.yaml, dengan org dan env adalah nama organisasi dan lingkungan Edge Anda.
  8. Tambahkan plugin response-override ke elemen plugins:sequence seperti yang ditunjukkan di bawah ini.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. Mulai ulang Edge Microgateway.
  10. Memanggil API melalui Edge Microgateway. (Panggilan API ini mengasumsikan bahwa Anda telah menyiapkan konfigurasi yang sama seperti tutorial dengan keamanan kunci API, seperti yang dijelaskan dalam Menyiapkan dan mengonfigurasi Edge Microgateway:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

Anatomi plugin

Plugin contoh Edge Microgateway berikut mengilustrasikan pola yang harus diikuti saat mengembangkan plugin Anda sendiri. Kode sumber untuk plugin contoh yang dibahas di bagian ini ada di plugins/header-uppercase/index.js.

  • Plugin adalah modul NPM standar dengan package.json dan index.js di folder root.
  • Plugin harus mengekspor fungsi init().
  • Fungsi init() menggunakan tiga argumen: config, logger, dan stats. Argumen ini dijelaskan dalam argumen fungsi init() Plugin.
  • init() menampilkan objek dengan pengendali fungsi bernama yang dipanggil jika peristiwa tertentu terjadi selama masa aktif permintaan.

Fungsi pengendali peristiwa

Plugin harus menerapkan beberapa atau semua fungsi pengendali peristiwa ini. Anda bebas menerapkan fungsi ini. Setiap fungsi yang diberikan bersifat opsional, dan plugin standar akan mengimplementasikan setidaknya sebagian fungsi ini.

Meminta pengendali peristiwa alur

Fungsi ini dipanggil saat peristiwa permintaan di Edge Microgateway.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

Fungsi onrequest

Dipanggil pada awal permintaan klien. Fungsi ini aktif saat byte pertama dari permintaan diterima oleh Edge Microgateway. Fungsi ini memberi Anda akses ke header permintaan, URL, parameter kueri, dan metode HTTP. Jika selanjutnya Anda memanggil dengan argumen pertama yang benar (seperti instance Error), pemrosesan permintaan akan berhenti dan permintaan target tidak akan dimulai.

Contoh:

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

Fungsi ondata_request

Dipanggil ketika sepotong data diterima dari klien. Meneruskan data permintaan ke plugin berikutnya dalam urutan plugin. Nilai yang ditampilkan dari plugin terakhir dalam urutan akan dikirim ke target. Kasus penggunaan umum, yang ditunjukkan di bawah ini, adalah mengubah data permintaan sebelum mengirimkannya ke target.

Contoh:

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

Fungsi onend_request

Dipanggil saat semua data permintaan telah diterima dari klien.

Contoh:

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

Fungsi onclose_request

Menunjukkan bahwa koneksi klien telah ditutup. Anda dapat menggunakan fungsi ini jika koneksi klien tidak dapat diandalkan. Callback ini dipanggil ketika koneksi soket ke klien ditutup.

Contoh:

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

Fungsi onerror_request

Dipanggil jika terjadi error saat menerima permintaan klien.

Contoh:

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

Pengendali peristiwa alur respons

Fungsi ini dipanggil pada peristiwa respons di Edge Microgateway.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

Fungsi onresponse

Dipanggil pada awal respons target. Fungsi ini aktif saat byte pertama respons diterima oleh Edge Microgateway. Fungsi ini memberi Anda akses ke header respons dan kode status.

Contoh:

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


Fungsi ondata_response

Dipanggil saat potongan data diterima dari target.

Contoh:

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


Fungsi onend_response

Dipanggil ketika semua data respons telah diterima dari target.

Contoh:

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

Fungsi onclose_response

Menunjukkan bahwa koneksi target telah ditutup. Anda dapat menggunakan fungsi ini jika koneksi target tidak dapat diandalkan. Callback ini dipanggil saat koneksi soket ke target ditutup.

Contoh:

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


Fungsi onerror_response

Dipanggil jika terjadi error saat menerima respons target.

Contoh:

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

Yang perlu Anda ketahui tentang fungsi pengendali peristiwa plugin

Fungsi pengendali peristiwa plugin dipanggil sebagai respons terhadap peristiwa tertentu yang terjadi saat Edge Microgateway memproses permintaan API tertentu.

  • Setiap pengendali fungsi init() (ondata_request, ondata_response, dll.) harus memanggil callback next() setelah selesai diproses. Jika Anda tidak memanggil next(), pemrosesan akan berhenti dan permintaan akan hang.
  • Argumen pertama untuk next() mungkin berupa error yang akan menyebabkan pemrosesan permintaan dihentikan.
  • Pengendali ondata_ dan onend_ harus memanggil next() dengan argumen kedua yang berisi data yang akan diteruskan ke target atau klien. Argumen ini dapat bernilai null jika plugin sedang melakukan buffering dan tidak memiliki cukup data untuk ditransformasi saat ini.
  • Perhatikan bahwa satu instance plugin digunakan untuk melayani semua permintaan dan respons. Jika ingin mempertahankan status per permintaan di antara panggilan, plugin dapat menyimpan status tersebut di properti yang ditambahkan ke objek request yang disediakan (req), yang masa aktifnya adalah durasi panggilan API.
  • Berhati-hatilah untuk menangkap semua error dan memanggil next() dengan error. Jika tidak dapat memanggil next(), panggilan API akan mengalami hang.
  • Berhati-hatilah agar tidak menimbulkan kebocoran memori karena dapat memengaruhi keseluruhan performa Edge Microgateway dan menyebabkannya error jika kehabisan memori.
  • Berhati-hatilah untuk mengikuti model Node.js dengan tidak melakukan tugas yang membutuhkan banyak komputasi di thread utama karena hal ini dapat berdampak buruk pada performa Edge Microgateway.

Tentang fungsi init() plugin

Bagian ini menjelaskan argumen yang diteruskan ke fungsi init(): config, logger, dan stats.

config

Data konfigurasi yang diperoleh dengan menggabungkan file konfigurasi Edge Microgateway dengan data yang didownload dari Apigee Edge akan ditempatkan dalam objek bernama: config.

Untuk menambahkan parameter konfigurasi bernama param dengan nilai foo ke plugin bernama response-override, masukkan parameter ini dalam file default.yaml:

response-override:
    param: foo

Kemudian, Anda dapat mengakses parameter tersebut dalam kode plugin, seperti ini:

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

Dalam hal ini, Anda akan melihat foo yang dicetak dalam output debug plugin:

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

Anda dapat mengakses konfigurasi microgateway gabungan dan data Apigee Edge yang telah didownload dalam objek turunan config.emgConfigs. Misalnya, Anda dapat mengakses data konfigurasi ini dalam fungsi init sebagai berikut:

module.exports.init = function(config, logger, stats) {
   let emgconfigs = config.emgConfigs;

Berikut adalah contoh data yang berisi 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

Pencatat sistem. Logger yang saat ini digunakan mengekspor fungsi ini, dengan objek dapat berupa string, permintaan HTTP, respons HTTP, atau instance Error.

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

stats

Objek yang menyimpan jumlah permintaan, respons, error, dan statistik gabungan lainnya yang terkait dengan permintaan dan respons yang mengalir melalui instance microgateway.

  • treqErrors - Jumlah permintaan target yang memiliki error.
  • treqErrors - Jumlah respons target dengan error.
  • statusCodes - Objek yang berisi jumlah kode respons:
{
  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 - Jumlah total permintaan.
  • responses - Jumlah total respons.
  • koneksi - Jumlah koneksi target yang aktif.

Tentang fungsi next()

Semua metode plugin harus memanggil next() untuk terus memproses metode berikutnya dalam rangkaian (atau proses plugin akan hang). Dalam siklus proses permintaan, metode pertama yang dipanggil adalah onrequest(). Metode selanjutnya yang akan dipanggil adalah metode ondata_request(); tetapi, ondata_request hanya dipanggil jika permintaan menyertakan data, seperti dalam kasus, misalnya, permintaan POST. Metode selanjutnya yang dipanggil adalah onend_request(), yang dipanggil saat pemrosesan permintaan selesai. Fungsi onerror_* hanya dipanggil jika terjadi error, dan memungkinkan Anda menangani error dengan kode kustom jika mau.

Misalnya data dikirim dalam permintaan, dan ondata_request() dipanggil. Perhatikan bahwa fungsi tersebut memanggil next() dengan dua parameter:

next(null, data);

Berdasarkan konvensi, parameter pertama digunakan untuk menyampaikan informasi error, yang kemudian dapat Anda tangani dalam fungsi berikutnya dalam rantai. Dengan menetapkannya ke null, argumen yang salah, yang menyatakan tidak ada error, dan pemrosesan permintaan akan berjalan seperti biasa. Jika argumen ini benar (seperti objek Error), pemrosesan permintaan akan berhenti dan permintaan akan dikirim ke target.

Parameter kedua meneruskan data permintaan ke fungsi berikutnya di rantai tersebut. Jika Anda tidak melakukan pemrosesan tambahan, data permintaan akan diteruskan tanpa perubahan ke target API. Namun, Anda memiliki kesempatan untuk mengubah data permintaan dalam metode ini, dan meneruskan permintaan yang telah diubah ke target. Misalnya, jika data permintaan berupa XML, dan target mengharapkan JSON, Anda dapat menambahkan kode ke metode ondata_request() yang (a) mengubah Jenis Konten header permintaan menjadi application/json dan mengonversi data permintaan menjadi JSON menggunakan cara apa pun yang Anda inginkan (misalnya, Anda dapat menggunakan pengonversi xml2json Node.js yang diperoleh dari NPM).

Mari kita lihat tampilannya:

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

Dalam hal ini, data permintaan (yang diasumsikan sebagai XML) dikonversi ke JSON, dan data yang ditransformasi diteruskan melalui next() ke fungsi berikutnya dalam rantai permintaan, sebelum diteruskan ke target backend.

Perhatikan bahwa Anda dapat menambahkan pernyataan debug lain untuk mencetak data yang ditransformasi untuk tujuan proses debug. Contoh:

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

Tentang urutan eksekusi pengendali plugin

Jika menulis plugin untuk Edge Microgateway, Anda harus memahami urutan eksekusi pengendali peristiwa plugin.

Poin penting yang perlu diingat adalah saat Anda menentukan urutan plugin di file konfigurasi Edge Microgateway, pengendali permintaan akan dieksekusi dalam urutan ascending, sedangkan pengendali respons dieksekusi dalam urutan descending.

Contoh berikut didesain untuk membantu Anda memahami urutan eksekusi ini.

1. Membuat tiga plugin sederhana

Pertimbangkan plugin berikut. Yang dilakukan hanyalah output konsol cetak saat pengendali peristiwanya dipanggil:

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

Sekarang, pertimbangkan untuk membuat dua plugin lagi, plugin-2 dan plugin-3, dengan kode yang sama (kecuali, ubah pernyataan console.log() menjadi plugin-2 dan plugin-3).

2. Meninjau kode plugin

Fungsi plugin yang diekspor di <microgateway-root-dir>/plugins/plugin-1/index.js adalah pengendali peristiwa yang dijalankan pada waktu tertentu selama pemrosesan permintaan dan respons. Misalnya, onrequest mengeksekusi byte pertama dari header permintaan yang diterima. Sementara, onend_response dieksekusi setelah byte terakhir data respons diterima.

Lihat pengendali ondata_response, yang dipanggil setiap kali bagian data respons diterima. Hal yang penting untuk diketahui adalah data respons tidak harus diterima sekaligus. Sebaliknya, data dapat diterima dalam potongan dengan panjang arbitrer.

3. Menambahkan plugin ke urutan plugin

Melanjutkan contoh ini, kami akan menambahkan plugin ke urutan plugin di file konfigurasi Edge Microgateway (~./edgemicro/config.yaml) sebagai berikut. Urutan penting. Ini menentukan urutan eksekusi pengendali plugin.

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

4. Memeriksa output debug

Sekarang, mari kita lihat output yang akan dihasilkan saat plugin ini dipanggil. Ada beberapa hal penting yang perlu diperhatikan:

  • Urutan plugin file konfigurasi Edge Microgateway (~./edgemicro/config.yaml) menentukan urutan pemanggilan pengendali peristiwa.
  • Handler permintaan dipanggil dalam urutan menaik (urutan kemunculannya dalam urutan plugin -- 1, 2, 3).
  • Pengendali respons dipanggil dalam urutan menurun -- 3, 2, 1.
  • Pengendali ondata_response dipanggil satu kali untuk setiap potongan data yang masuk. Dalam contoh ini ({i>output<i} ditampilkan di bawah), dua potongan diterima.

Berikut adalah contoh output debug yang dihasilkan saat ketiga plugin ini digunakan dan permintaan dikirim melalui Edge Microgateway. Cukup perhatikan urutan pemanggilan pengendali:

  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

Ringkasan

Memahami urutan pemanggilan pengendali plugin sangat penting saat Anda mencoba menerapkan fungsi plugin kustom, seperti mengumpulkan dan mengubah data permintaan atau respons.

Ingatlah bahwa pengendali permintaan dijalankan dalam urutan yang ditetapkan untuk plugin dalam file konfigurasi Edge Microgateway, dan pengendali respons dijalankan dalam urutan yang berlawanan.

Tentang menggunakan variabel global dalam plugin

Setiap permintaan ke Edge Microgateway dikirim ke instance plugin yang sama; oleh karena itu, status permintaan kedua dari klien lain akan menimpa status pertama. Satu-satunya tempat yang aman untuk menyimpan status plugin adalah dengan menyimpan status di properti pada objek permintaan atau respons (yang masa aktifnya dibatasi pada permintaan).

Menulis ulang URL target dalam plugin

Ditambahkan di: v2.3.3

Anda dapat mengganti URL target default dalam plugin secara dinamis dengan mengubah variabel berikut dalam kode plugin: req.targetHostname dan req.targetPath.

Ditambahkan di: v2.4.x

Anda juga dapat mengganti port endpoint target dan memilih antara HTTP dan HTTPS. Ubah variabel-variabel ini dalam kode plugin Anda: req.targetPort dan req.targetSecure. Untuk memilih HTTPS, tetapkan req.targetSecure ke true; untuk HTTP, tetapkan ke false. Jika Anda menetapkan req.targetSecure ke true, lihat thread diskusi ini untuk informasi selengkapnya.

Dihapus di: v3.3.3

Plugin contoh bernama eurekaclient telah dihapus dari Edge Microgateway di v.3.3.3. Lihat Catatan rilis.

Penghapusan fitur ini tidak memengaruhi fungsi inti microgateway Edge atau penulisan ulang URL target. Anda dapat mengonfigurasi pencarian endpoint dinamis dan mengganti variabel target seperti req.targetHostname, req.targetPath, req.targetPort, dan req.targetSecure di level plugin. Lihat Menulis ulang URL target di plugin.


Contoh plugin

Plugin ini disediakan bersama penginstalan Edge Microgateway Anda. Anda dapat menemukannya di penginstalan Edge Microgateway di sini:

[prefix]/lib/node_modules/edgemicro/plugins

dengan [prefix] adalah direktori awalan npm seperti yang dijelaskan dalam "Di mana Edge Microgateway terinstal" dalam Menginstal Edge Microgateway.

akumulasi-permintaan

Plugin ini mengumpulkan potongan data dari klien ke dalam properti array yang dilampirkan ke objek permintaan. Saat semua data permintaan diterima, array digabungkan menjadi Buffer yang kemudian diteruskan ke plugin berikutnya dalam urutan. Plugin ini harus menjadi plugin pertama dalam urutan agar plugin berikutnya menerima data permintaan yang terakumulasi.

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

    }

  };

}

akumulasi-respons

Plugin ini mengumpulkan potongan data dari target ke dalam properti array yang dilampirkan ke objek respons. Saat semua data respons diterima, array digabungkan menjadi Buffer yang kemudian diteruskan ke plugin berikutnya dalam urutan. Karena plugin ini beroperasi pada respons, yang diproses dalam urutan terbalik, Anda harus menempatkannya sebagai plugin terakhir dalam urutan.

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

  };

}

plugin header-uppercase

Distribusi Edge Microgateway menyertakan plugin contoh yang disebut <microgateway-root-dir>/plugins/header-uppercase. Contoh ini mencakup komentar yang menjelaskan setiap pengendali fungsi. Contoh ini melakukan beberapa transformasi data sederhana dari respons target serta menambahkan header kustom ke permintaan klien dan respons target.

Berikut adalah kode sumber untuk <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();
    }

  };

}


ubah huruf besar

Ini adalah plugin transformasi umum yang dapat Anda ubah untuk melakukan jenis transformasi apa pun yang Anda inginkan. Contoh ini hanya mengubah data respons dan permintaan menjadi huruf besar.

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

  };

}