Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào
tài liệu Apigee X. thông tin
Edge Microgateway phiên bản 3.0.x
Đối tượng
Chủ đề này dành cho những nhà phát triển muốn mở rộng các tính năng của Edge Microgateway bằng cách viết các trình bổ trợ tuỳ chỉnh. Nếu muốn viết một trình bổ trợ mới, bạn cần có kinh nghiệm về JavaScript và Node.js.
Trình bổ trợ Edge Microgateway tuỳ chỉnh là gì?
Trình bổ trợ là một mô-đun Node.js giúp bổ sung chức năng cho Edge Microgateway. Các mô-đun bổ trợ tuân theo một mẫu nhất quán và được lưu trữ ở một vị trí mà Edge Microgateway biết, cho phép các mô-đun này được phát hiện và chạy tự động. Một số trình bổ trợ được xác định trước sẽ được cung cấp khi bạn cài đặt Edge Microgateway. Các plugin này bao gồm plugin để xác thực, ngăn chặn đột biến, hạn ngạch và phân tích. Các trình bổ trợ hiện có này được mô tả trong phần Sử dụng trình bổ trợ.
Bạn có thể thêm các tính năng và chức năng mới vào cổng siêu nhỏ bằng cách viết các trình bổ trợ tuỳ chỉnh. Theo mặc định, Edge Microgateway về cơ bản là một proxy truyền qua an toàn, truyền các yêu cầu và phản hồi không thay đổi đến và từ các dịch vụ mục tiêu. Với các trình bổ trợ tuỳ chỉnh, bạn có thể tương tác theo phương thức lập trình với các yêu cầu và phản hồi truyền qua cổng siêu nhỏ.
Vị trí đặt mã trình bổ trợ tuỳ chỉnh
Một thư mục cho các trình bổ trợ tuỳ chỉnh được đưa vào quy trình cài đặt Edge Microgateway tại đây:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
trong đó [prefix] là thư mục tiền tố npm như được mô tả trong phần "Edge Microgateway được cài đặt ở đâu" trong Cài đặt Edge Microgateway.
Bạn có thể thay đổi thư mục mặc định này cho trình bổ trợ. Xem phần Nơi tìm plugin.
Xem xét các trình bổ trợ được xác định trước
Trước khi cố gắng phát triển trình bổ trợ của riêng mình, bạn nên kiểm tra để đảm bảo không có trình bổ trợ nào được xác định trước đáp ứng các yêu cầu của bạn. Các trình bổ trợ này nằm trong:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
trong đó [prefix] là thư mục tiền tố npm. Xem thêm phần "Edge Microgateway được cài đặt ở đâu" trong phần Cài đặt Edge Microgateway.
Để biết thông tin chi tiết, hãy xem phần Các trình bổ trợ được xác định trước đi kèm với Edge Microgateway.
Viết một trình bổ trợ đơn giản
Trong phần này, chúng ta sẽ tìm hiểu các bước cần thiết để tạo một trình bổ trợ đơn giản. Trình bổ trợ này sẽ ghi đè dữ liệu phản hồi (bất kể dữ liệu đó là gì) bằng chuỗi "Hello, World!" và in dữ liệu đó ra thiết bị đầu cuối.
- Nếu Edge Microgateway đang chạy, hãy dừng ngay:
edgemicro stop
-
cdvào thư mục trình bổ trợ tuỳ chỉnh:cd [prefix]/lib/node_modules/edgemicro/pluginstrong đó
[prefix]là thư mục tiền tốnpmnhư được mô tả trong phần "Edge Microgateway được cài đặt ở đâu" trong Cài đặt Edge Microgateway. - Tạo một dự án trình bổ trợ mới có tên là response-override và
cdvào dự án đó:
mkdir response-override && cd response-override
- Tạo một dự án Node.js mới:
Nhấn phím Return nhiều lần để chấp nhận các giá trị mặc định.npm init
- Sử dụng trình chỉnh sửa văn bản để tạo một tệp mới có tên
index.js. - Sao chép mã sau đây vào
index.jsrồi lưu tệp.
'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"); } }; }
- Bây giờ, bạn đã tạo một trình bổ trợ và cần thêm trình bổ trợ đó vào cấu hình Edge Microgateway.
Mở tệp
$HOME/.edgemicro/[org]-[env]-config.yaml, trong đóorgvàenvlà tên tổ chức và môi trường Edge của bạn. - Thêm trình bổ trợ
response-overridevào phần tửplugins:sequencenhư minh hoạ dưới đây.
... plugins: dir: ../plugins sequence: - oauth - response-override ... - Khởi động lại Edge Microgateway.
- Gọi một API thông qua Edge Microgateway. (Lệnh gọi API này giả định rằng bạn đã thiết lập cùng một cấu hình như hướng dẫn có bảo mật khoá API, như mô tả trong phần Thiết lập và định cấu hình Edge Microgateway:
curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo Hello, World!
Phân tích thành phần của một trình bổ trợ
Trình bổ trợ mẫu Edge Microgateway sau đây minh hoạ mẫu cần tuân theo khi phát triển trình bổ trợ của riêng bạn. Mã nguồn cho trình bổ trợ mẫu được thảo luận trong phần này nằm trong plugins/header-uppercase/index.js.
- Trình bổ trợ là các mô-đun NPM tiêu chuẩn có
package.jsonvàindex.jstrong thư mục gốc. - Trình bổ trợ phải xuất một hàm init().
- Hàm init() nhận 3 đối số: config, logger và stats. Các đối số này được mô tả trong đối số hàm Plugin init().
- init() trả về một đối tượng có các trình xử lý hàm được đặt tên. Các trình xử lý này được gọi khi một số sự kiện nhất định xảy ra trong vòng đời của một yêu cầu.
Hàm trình xử lý sự kiện
Trình bổ trợ phải triển khai một số hoặc tất cả các hàm trình xử lý sự kiện này. Bạn có thể tự triển khai các hàm này. Mọi hàm đã cho đều là không bắt buộc và một trình bổ trợ thông thường sẽ triển khai ít nhất một tập hợp con của các hàm này.
Yêu cầu trình xử lý sự kiện luồng
Các hàm này được gọi là các sự kiện yêu cầu trong Edge Microgateway.
onrequestondata_requestonend_requestonclose_requestonerror_request
onrequest hàm
Được gọi khi bắt đầu yêu cầu của ứng dụng. Hàm này sẽ kích hoạt khi Edge Microgateway nhận được byte đầu tiên của yêu cầu. Hàm này cho phép bạn truy cập vào tiêu đề yêu cầu, URL, tham số truy vấn và phương thức HTTP. Nếu bạn gọi next bằng đối số đầu tiên có giá trị đúng (chẳng hạn như một phiên bản của Lỗi), thì quá trình xử lý yêu cầu sẽ dừng và yêu cầu mục tiêu sẽ không được bắt đầu.
Ví dụ:
onrequest: function(req, res, next) { debug('plugin onrequest'); req.headers['x-foo-request-start'] = Date.now(); next(); }
ondata_request hàm
Được gọi khi một khối dữ liệu được nhận từ ứng dụng. Truyền dữ liệu yêu cầu đến trình bổ trợ tiếp theo trong chuỗi trình bổ trợ. Giá trị trả về từ trình bổ trợ cuối cùng trong chuỗi sẽ được gửi đến đích. Một trường hợp sử dụng điển hình (như minh hoạ bên dưới) là chuyển đổi dữ liệu yêu cầu trước khi gửi đến mục tiêu.
Ví dụ:
ondata_request: function(req, res, data, next) { debug('plugin ondata_request ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }
onend_request hàm
Được gọi khi tất cả dữ liệu yêu cầu đã được nhận từ máy khách.
Ví dụ:
onend_request: function(req, res, data, next) { debug('plugin onend_request'); next(null, data); }
onclose_request hàm
Cho biết kết nối máy khách đã đóng. Bạn có thể sử dụng hàm này trong trường hợp kết nối máy khách không đáng tin cậy. Phương thức này được gọi khi kết nối ổ cắm với máy khách bị đóng.
Ví dụ:
onclose_request: function(req, res, next) { debug('plugin onclose_request'); next(); }
onerror_request hàm
Được gọi nếu xảy ra lỗi khi nhận yêu cầu của ứng dụng.
Ví dụ:
onerror_request: function(req, res, err, next) { debug('plugin onerror_request ' + err); next(); }
Trình xử lý sự kiện luồng phản hồi
Các hàm này được gọi trên các sự kiện phản hồi trong Edge Microgateway.
onresponseondata_responseonend_responseonclose_responseonerror_response
onresponse hàm
Được gọi khi bắt đầu phản hồi mục tiêu. Hàm này sẽ kích hoạt khi byte đầu tiên của phản hồi được Edge Microgateway nhận. Hàm này cho phép bạn truy cập vào tiêu đề phản hồi và mã trạng thái.
Ví dụ:
onresponse: function(req, res, next) { debug('plugin onresponse'); res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start']) next(); }
ondata_responsehàm
Được gọi khi một khối dữ liệu được nhận từ đích đến.
Ví dụ:
ondata_response: function(req, res, data, next) { debug('plugin ondata_response ' + data.length); var transformed = data.toString().toUpperCase(); next(null, transformed); }
onend_response function
Được gọi khi tất cả dữ liệu phản hồi đã được nhận từ đích đến.
Ví dụ:
onend_response: function(req, res, data, next) { debug('plugin onend_response'); next(null, data); }
onclose_response hàm
Cho biết kết nối đích đã đóng. Bạn có thể sử dụng hàm này trong trường hợp kết nối đích không đáng tin cậy. Phương thức này được gọi khi kết nối ổ cắm đến đích bị đóng.
Ví dụ:
onclose_response: function(req, res, next) { debug('plugin onclose_response'); next(); }
onerror_responsehàm
Được gọi nếu xảy ra lỗi khi nhận được phản hồi mục tiêu.
Ví dụ:
onerror_response: function(req, res, err, next) { debug('plugin onerror_response ' + err); next(); }
Những điều bạn cần biết về các hàm trình xử lý sự kiện của trình bổ trợ
Các hàm trình xử lý sự kiện của trình bổ trợ được gọi để phản hồi các sự kiện cụ thể xảy ra trong khi Edge Microgateway xử lý một yêu cầu API nhất định.
- Mỗi trình xử lý hàm init() (ondata_request, ondata_response, v.v.) phải gọi lệnh gọi lại next() khi hoàn tất quá trình xử lý. Nếu bạn không gọi next(), quá trình xử lý sẽ dừng và yêu cầu sẽ bị treo.
- Đối số đầu tiên cho next() có thể là một lỗi khiến quá trình xử lý yêu cầu kết thúc.
- Các trình xử lý ondata_ và onend_ phải gọi next() bằng đối số thứ hai chứa dữ liệu sẽ được truyền đến đích hoặc máy khách. Đối số này có thể có giá trị rỗng nếu trình bổ trợ đang lưu vào bộ nhớ đệm và không có đủ dữ liệu để chuyển đổi tại thời điểm đó.
- Xin lưu ý rằng một phiên bản duy nhất của trình bổ trợ được dùng để xử lý tất cả các yêu cầu và phản hồi. Nếu muốn giữ lại trạng thái theo yêu cầu giữa các lệnh gọi, một trình bổ trợ có thể lưu trạng thái đó trong một thuộc tính được thêm vào đối tượng request (req) được cung cấp, có thời gian tồn tại là thời lượng của lệnh gọi API.
- Hãy cẩn thận để phát hiện tất cả các lỗi và gọi next() cùng với lỗi. Việc không gọi next() sẽ khiến lệnh gọi API bị treo.
- Hãy cẩn thận để không gây ra tình trạng rò rỉ bộ nhớ vì điều đó có thể ảnh hưởng đến hiệu suất tổng thể của Edge Microgateway và khiến cổng này gặp sự cố nếu hết bộ nhớ.
- Hãy cẩn thận làm theo mô hình Node.js bằng cách không thực hiện các tác vụ đòi hỏi nhiều sức mạnh tính toán trong luồng chính vì điều này có thể ảnh hưởng tiêu cực đến hiệu suất của Edge Microgateway.
Giới thiệu về hàm init() của trình bổ trợ
Phần này mô tả các đối số được truyền đến hàm init(): config, logger và stats.
config
Một đối tượng cấu hình thu được sau khi hợp nhất tệp cấu hình Edge Microgateway với thông tin được tải xuống từ Apigee Edge, chẳng hạn như sản phẩm và hạn mức. Bạn có thể tìm thấy cấu hình dành riêng cho trình bổ trợ trong đối tượng này: config.<plugin-name>.
Để thêm một tham số cấu hình có tên là param với giá trị foo vào một trình bổ trợ có tên là response-override, hãy đặt tham số này vào tệp default.yaml:
response-override:
param: fooSau đó, bạn có thể truy cập vào tham số trong mã trình bổ trợ của mình, như sau:
// 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); },
Trong trường hợp này, bạn sẽ thấy foo được in trong đầu ra gỡ lỗi của trình bổ trợ:
Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo
trình ghi nhật ký
Trình ghi nhật ký hệ thống. Trình ghi nhật ký hiện đang được sử dụng sẽ xuất các hàm này, trong đó đối tượng có thể là một chuỗi, yêu cầu HTTP, phản hồi HTTP hoặc một phiên bản Lỗi.
info(object, message)warn(object, message)error(object, message)
số liệu thống kê
Một đối tượng lưu giữ số lượng yêu cầu, phản hồi, lỗi và các số liệu thống kê tổng hợp khác liên quan đến các yêu cầu và phản hồi truyền qua một phiên bản cổng siêu nhỏ.
- treqErrors – Số yêu cầu mục tiêu gặp lỗi.
- treqErrors – Số lượng phản hồi mục tiêu bị lỗi.
- statusCodes – Một đối tượng chứa số lượng mã phản hồi:
{
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 – Tổng số yêu cầu.
- responses – Tổng số lượt phản hồi.
- connections – Số lượng kết nối đích đang hoạt động.
Giới thiệu về hàm next()
Tất cả các phương thức của trình bổ trợ đều phải gọi next() để tiếp tục xử lý phương thức tiếp theo trong chuỗi (nếu không, quy trình của trình bổ trợ sẽ bị treo). Trong vòng đời yêu cầu, phương thức đầu tiên được gọi là onrequest(). Phương thức tiếp theo được gọi là phương thức ondata_request(); tuy nhiên, ondata_request chỉ được gọi nếu yêu cầu có dữ liệu, chẳng hạn như trong trường hợp yêu cầu POST. Phương thức tiếp theo được gọi sẽ là onend_request(). Phương thức này được gọi khi quá trình xử lý yêu cầu hoàn tất. Các hàm onerror_* chỉ được gọi trong trường hợp xảy ra lỗi và cho phép bạn xử lý các lỗi bằng mã tuỳ chỉnh nếu muốn.
Giả sử dữ liệu được gửi trong yêu cầu và ondata_request() được gọi. Lưu ý rằng hàm gọi next() với 2 tham số:
next(null, data);
Theo quy ước, tham số đầu tiên được dùng để truyền tải thông tin lỗi mà sau đó bạn có thể xử lý trong một hàm tiếp theo trong chuỗi. Bằng cách đặt thành null, một đối số sai, chúng ta đang nói rằng không có lỗi và quá trình xử lý yêu cầu sẽ diễn ra bình thường. Nếu đối số này là truthy (chẳng hạn như đối tượng Lỗi), thì quá trình xử lý yêu cầu sẽ dừng và yêu cầu được gửi đến đích.
Tham số thứ hai truyền dữ liệu yêu cầu đến hàm tiếp theo trong chuỗi. Nếu bạn không xử lý thêm, thì dữ liệu yêu cầu sẽ được truyền không thay đổi đến đích của API.
Tuy nhiên, bạn có thể sửa đổi dữ liệu yêu cầu trong phương thức này và chuyển yêu cầu đã sửa đổi đến đích. Ví dụ: nếu dữ liệu yêu cầu là XML và đích đến mong muốn là JSON, thì bạn có thể thêm mã vào phương thức ondata_request() để (a) thay đổi Content-Type của tiêu đề yêu cầu thành application/json và chuyển đổi dữ liệu yêu cầu thành JSON bằng bất kỳ phương tiện nào bạn muốn (ví dụ: bạn có thể sử dụng trình chuyển đổi xml2json Node.js lấy từ NPM).
Hãy xem cách thực hiện:
ondata_request: function(req, res, data, next) { debug('****** plugin ondata_request'); var translated_data = parser.toJson(data); next(null, translated_data); },
Trong trường hợp này, dữ liệu yêu cầu (được giả định là XML) sẽ được chuyển đổi thành JSON và dữ liệu đã chuyển đổi sẽ được truyền qua next() đến hàm tiếp theo trong chuỗi yêu cầu, trước khi được truyền đến đích đến phụ trợ.
Xin lưu ý rằng bạn có thể thêm một câu lệnh gỡ lỗi khác để in dữ liệu đã chuyển đổi cho mục đích gỡ lỗi. Ví dụ:
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); },
Giới thiệu về thứ tự thực thi trình xử lý trình bổ trợ
Nếu viết các trình bổ trợ cho Edge Microgateway, bạn cần hiểu rõ thứ tự thực thi của các trình xử lý sự kiện trình bổ trợ.
Điều quan trọng cần nhớ là khi bạn chỉ định một chuỗi trình bổ trợ trong tệp cấu hình Edge Microgateway, các trình xử lý yêu cầu sẽ thực thi theo thứ tự tăng dần, trong khi các trình xử lý phản hồi sẽ thực thi theo thứ tự giảm dần.
Ví dụ sau đây được thiết kế để giúp bạn hiểu rõ trình tự thực thi này.
1. Tạo 3 trình bổ trợ đơn giản
Hãy xem xét trình bổ trợ sau. Thao tác này chỉ in đầu ra của bảng điều khiển khi các trình xử lý sự kiện của nó được gọi:
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); } }; }
Bây giờ, hãy cân nhắc việc tạo thêm 2 trình bổ trợ, plugin-2 và plugin-3, bằng cùng một mã (ngoại trừ việc thay đổi các câu lệnh console.log() thành plugin-2 và plugin-3 tương ứng).
2. Xem lại mã trình bổ trợ
Các hàm bổ trợ được xuất trong <microgateway-root-dir>/plugins/plugin-1/index.js là trình xử lý sự kiện thực thi vào những thời điểm cụ thể trong quá trình xử lý yêu cầu và phản hồi. Ví dụ: onrequest thực thi byte đầu tiên của tiêu đề yêu cầu được nhận. Trong khi đó, onend_response sẽ thực thi sau khi nhận được byte cuối cùng của dữ liệu phản hồi.
Hãy xem trình xử lý ondata_response – trình xử lý này được gọi bất cứ khi nào một khối dữ liệu phản hồi được nhận. Điều quan trọng cần biết là dữ liệu phản hồi không nhất thiết phải được nhận cùng một lúc. Thay vào đó, dữ liệu có thể được nhận theo các khối có độ dài tuỳ ý.
3. Thêm các trình bổ trợ vào chuỗi trình bổ trợ
Tiếp tục với ví dụ này, chúng ta sẽ thêm các trình bổ trợ vào chuỗi trình bổ trợ trong tệp cấu hình Edge Microgateway (~./edgemicro/config.yaml) như sau. Thứ tự này rất quan trọng. Nó xác định thứ tự thực thi của các trình xử lý trình bổ trợ.
plugins:
dir: ../plugins
sequence:
- plugin-1
- plugin-2
- plugin-3
4. Kiểm tra kết quả gỡ lỗi
Bây giờ, hãy xem xét đầu ra sẽ được tạo khi các trình bổ trợ này được gọi. Có một vài điểm quan trọng cần lưu ý:
- Trình tự bổ trợ trong tệp cấu hình Edge Microgateway (
~./edgemicro/config.yaml) chỉ định thứ tự gọi các trình xử lý sự kiện. - Trình xử lý yêu cầu được gọi theo thứ tự tăng dần (thứ tự mà chúng xuất hiện trong chuỗi trình bổ trợ – 1, 2, 3).
- Các trình xử lý phản hồi được gọi theo thứ tự giảm dần – 3, 2, 1.
- Trình xử lý
ondata_responseđược gọi một lần cho mỗi khối dữ liệu đến. Trong ví dụ này (đầu ra được minh hoạ bên dưới), hai khối được nhận.
Sau đây là đầu ra gỡ lỗi mẫu được tạo khi sử dụng 3 trình bổ trợ này và một yêu cầu được gửi qua Edge Microgateway. Hãy lưu ý đến thứ tự gọi các trình xử lý:
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
Tóm tắt
Việc hiểu rõ thứ tự gọi các trình xử lý trình bổ trợ là rất quan trọng khi bạn cố gắng triển khai chức năng trình bổ trợ tuỳ chỉnh, chẳng hạn như tích luỹ và chuyển đổi dữ liệu yêu cầu hoặc phản hồi.
Bạn chỉ cần nhớ rằng các trình xử lý yêu cầu được thực thi theo thứ tự mà các trình bổ trợ được chỉ định trong tệp cấu hình Edge Microgateway và các trình xử lý phản hồi được thực thi theo thứ tự ngược lại.
Giới thiệu về cách sử dụng biến toàn cục trong trình bổ trợ
Mọi yêu cầu đến Edge Microgateway đều được gửi đến cùng một phiên bản của một trình bổ trợ; do đó, trạng thái của yêu cầu thứ hai từ một ứng dụng sẽ ghi đè trạng thái của yêu cầu đầu tiên. Nơi duy nhất an toàn để lưu trạng thái của trình bổ trợ là lưu trạng thái trong một thuộc tính trên đối tượng yêu cầu hoặc đối tượng phản hồi (thời gian tồn tại của đối tượng này bị giới hạn trong thời gian tồn tại của yêu cầu).
Viết lại URL mục tiêu trong các trình bổ trợ
Được thêm vào trong: phiên bản 2.3.3
Bạn có thể ghi đè URL đích mặc định trong một trình bổ trợ một cách linh động bằng cách sửa đổi các biến này trong mã trình bổ trợ: req.targetHostname và req.targetPath.
Được thêm vào trong: phiên bản 2.4.x
Bạn cũng có thể ghi đè cổng điểm cuối mục tiêu và chọn giữa HTTP và HTTPS. Sửa đổi các biến này trong mã trình bổ trợ: req.targetPort và req.targetSecure. Để chọn HTTPS, hãy đặt req.targetSecure thành true; đối với HTTP, hãy đặt thành false. Nếu bạn đặt req.targetSecure thành true, hãy xem chuỗi thảo luận này để biết thêm thông tin.
Trình bổ trợ mẫu
Các trình bổ trợ này được cung cấp cùng với bản cài đặt Edge Microgateway. Bạn có thể tìm thấy các tệp này trong quá trình cài đặt Edge Microgateway tại đây:
[prefix]/lib/node_modules/edgemicro/plugins
trong đó [prefix] là thư mục tiền tố npm như được mô tả trong phần "Edge Microgateway được cài đặt ở đâu" trong Cài đặt Edge Microgateway.
accumulate-request
Trình bổ trợ này tích luỹ các khối dữ liệu từ ứng dụng khách vào một thuộc tính mảng được đính kèm vào đối tượng yêu cầu. Khi nhận được tất cả dữ liệu yêu cầu, mảng sẽ được nối vào một Buffer, sau đó được truyền đến trình bổ trợ tiếp theo trong chuỗi. Trình bổ trợ này phải là trình bổ trợ đầu tiên trong chuỗi để các trình bổ trợ tiếp theo nhận được dữ liệu yêu cầu đã tích luỹ.
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
Trình bổ trợ này tích luỹ các khối dữ liệu từ đích đến một thuộc tính mảng được đính kèm vào đối tượng phản hồi. Khi nhận được tất cả dữ liệu phản hồi, mảng sẽ được nối vào một Buffer, sau đó được truyền đến trình bổ trợ tiếp theo trong chuỗi. Vì trình bổ trợ này hoạt động trên các phản hồi được xử lý theo thứ tự ngược lại, nên bạn phải đặt trình bổ trợ này làm trình bổ trợ cuối cùng trong chuỗi.
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 plugin
Các bản phân phối Edge Microgateway bao gồm một trình bổ trợ mẫu có tên là <microgateway-root-dir>/plugins/header-uppercase. Mẫu này có các nhận xét mô tả từng trình xử lý hàm. Mẫu này thực hiện một số hoạt động chuyển đổi dữ liệu đơn giản đối với phản hồi mục tiêu và thêm tiêu đề tuỳ chỉnh vào yêu cầu của máy khách và phản hồi mục tiêu.
Sau đây là mã nguồn cho <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(); } }; }
transform-uppercase
Đây là một trình bổ trợ biến đổi chung mà bạn có thể sửa đổi để thực hiện bất kỳ loại biến đổi nào bạn muốn. Ví dụ này chỉ đơn giản là chuyển đổi dữ liệu phản hồi và yêu cầu thành chữ hoa.
*/ 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); } }; }