커스텀 플러그인 개발

<ph type="x-smartling-placeholder"></ph> 현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서.
정보

Edge Microgateway v. 2.5.x

잠재고객

이 주제는 사용할 수 있습니다 새 플러그인을 작성하려면 JavaScript 및 Node.js를 사용해 본 경험이 있어야 합니다. 필요합니다.

커스텀 Edge Microgateway 플러그인이란 무엇인가요?

플러그인은 Edge Microgateway에 기능을 추가하는 Node.js 모듈입니다. 플러그인 모듈 일관된 패턴을 따르고 Edge Microgateway에 알려진 위치에 저장되므로 자동으로 검색되고 실행됩니다 여러 가지 사전 정의된 플러그인이 제공됩니다. Edge Microgateway를 설치합니다. 여기에는 인증용 플러그인, 급증 저지, 할당량 및 분석. 이러한 기존 플러그인은 플러그인 사용에 설명되어 있습니다.

커스텀 구성 파일을 작성하여 마이크로게이트웨이에 새로운 기능을 플러그인을 사용합니다. 기본적으로 Edge Microgateway는 기본적으로 안전한 패스 스루 프록시로 대상 서비스와 변경되지 않은 요청 및 응답을 전달합니다. 맞춤 플러그인을 사용하면 마이크로 게이트웨이를 통해 전달되는 요청 및 응답과 프로그래매틱 방식으로 상호작용합니다.

맞춤 플러그인 코드를 삽입할 위치

커스텀 플러그인 폴더는 Edge Microgateway 설치의 일부로 포함됩니다. 여기:

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

여기서 [prefix]는 다음과 같은 npm 접두사 디렉터리입니다. 'Edge Microgateway 설치 위치'에 설명되어 있음 Edge 설치에 Microgateway를 제공합니다.

이 기본 플러그인 디렉터리를 변경할 수 있습니다. 위치: 플러그인을 사용합니다.

사전 정의된 플러그인 검토

자체 플러그인을 개발하기 전에 사전 정의된 플러그인에 플러그인이 요구사항을 충족하는지 확인합니다 이러한 플러그인은 다음 위치에 있습니다.

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

여기서 [prefix]npm 프리픽스 디렉터리입니다. 자세한 내용은 "Edge Microgateway가 설치된 위치" Edge 설치 시 Microgateway를 설치합니다.

자세한 내용은 사전 정의됨 Edge Microgateway와 함께 제공되는 플러그인)

간단한 플러그인 작성

이 섹션에서는 간단한 플러그인을 만드는 데 필요한 단계를 살펴봅니다. 이 플러그인 응답 데이터가 무엇이든 'Hello, World!' 문자열로 재정의됩니다. 를 사용하여 터미널에 연결합니다.

  1. Edge Microgateway가 실행 중인 경우 지금 중지합니다.
    edgemicro stop
    
  2. cd를 맞춤 플러그인 디렉터리로 이동합니다.

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

    여기서 [prefix]npm 프리픽스 디렉터리입니다. 'Edge Microgateway 설치 위치'에 설명된 대로) Edge 설치에 Microgateway를 제공합니다.

  3. response-overridecd라는 새 플러그인 프로젝트를 만듭니다.
    mkdir response-override && cd response-override
    
  4. 새 Node.js 프로젝트를 만듭니다.
    npm init
    
    기본값을 수락하려면 Return 키를 여러 번 누릅니다.
  5. 텍스트 편집기를 사용하여 index.js이라는 새 파일을 만듭니다.
  6. 다음 코드를 index.js에 복사하고 파일을 저장합니다.
    '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. 이제 플러그인을 만들었으므로 이를 Edge Microgateway 구성에 추가해야 합니다. $HOME/.edgemicro/[org]-[env]-config.yaml 파일을 엽니다. 여기서 orgenv은 Edge 조직 및 환경 이름입니다.
  8. plugins:sequence 요소에 response-override 플러그인 추가 변경할 수 있습니다.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
        
    
    드림
  9. Edge Microgateway를 다시 시작합니다.
  10. Edge Microgateway를 통해 API 호출 (이 API 호출은 설정 Edge Microgateway 구성):
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

플러그인 분석

다음 Edge Microgateway 샘플 플러그인은 이 프로세스를 실행할 때 따라야 할 패턴을 보여줍니다. 자체 플러그인을 개발하세요. 이 섹션에서 설명하는 샘플 플러그인의 소스 코드는 다음과 같습니다. plugins/header-uppercase/index.js.

  • 플러그인은 package.jsonindex.js를 사용하는 표준 NPM 모듈입니다. 를 찾습니다.
  • 플러그인은 init() 함수를 내보내야 합니다.
  • init() 함수는 세 가지 인수, 즉 config, logger, stats). 이러한 인수는 플러그인에 설명되어 있습니다. init() 함수 인수입니다.
  • init()는 다음 경우에 호출되는 이름이 지정된 함수 핸들러가 있는 객체를 반환합니다. 특정 이벤트는 요청 수명 동안 발생할 수 있습니다.

이벤트 핸들러 함수

플러그인은 이러한 이벤트 핸들러 함수의 일부 또는 전부를 구현해야 합니다. 이러한 사용할 수 있습니다 주어진 함수는 선택사항이며, 일반적인 플러그인은 이러한 함수의 하위 집합으로 지정할 수 있습니다

요청 흐름 이벤트 핸들러

이러한 함수는 Edge Microgateway에서 요청 이벤트 시 호출됩니다.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest 함수

클라이언트 요청 시작 시 호출됩니다. 이 함수는 Edge Microgateway에서 요청을 수신합니다. 이 함수를 사용하면 요청 헤더에 액세스할 수 있습니다. URL, 쿼리 매개변수, HTTP 메서드가 포함됩니다. 올바른 첫 번째 인수 (예: 오류가 발생하면 요청 처리가 중지되고 대상 요청이 시작되지 않습니다.

예:

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

ondata_request 함수

클라이언트에서 데이터 청크가 수신될 때 호출됩니다. 요청 데이터를 플러그인 시퀀스에 추가합니다. 시퀀스의 마지막 플러그인에서 반환된 값이 타겟. 아래와 같은 일반적인 사용 사례는 요청 데이터를 전송하기 전에 변환하는 것입니다. 타겟에 전달합니다.

예:

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

onend_request 함수

클라이언트에서 모든 요청 데이터가 수신되었을 때 호출됩니다.

예:

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

onclose_request 함수

클라이언트 연결이 종료되었음을 나타냅니다. 이 함수는 클라이언트 연결이 불안정한 경우 클라이언트와의 소켓 연결이 닫힘

예:

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

onerror_request 함수

클라이언트 요청을 수신하는 중에 오류가 발생하면 호출됩니다.

예:

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

응답 흐름 이벤트 핸들러

이러한 함수는 Edge Microgateway에서 응답 이벤트 시 호출됩니다.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

onresponse 함수

타겟 응답의 시작 시 호출됩니다. 이 함수는 Edge Microgateway에서 응답을 수신합니다. 이 함수를 사용하면 응답 헤더에 액세스할 수 있습니다. 상태 코드가 표시됩니다

예:

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 함수

대상에서 데이터 청크가 수신될 때 호출됩니다.

예:

ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }
드림 <ph type="x-smartling-placeholder">


onend_response 함수

모든 응답 데이터가 타겟에서 수신되었을 때 호출됩니다.

예:

onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    }
드림 <ph type="x-smartling-placeholder">

onclose_response 함수

대상 연결이 닫혔음을 나타냅니다. 이 함수는 대상 연결을 신뢰할 수 없습니다. 대상에 대한 소켓 연결이 닫힘

예:

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


onerror_response 함수

타겟 응답을 수신하는 중에 오류가 발생하면 호출됩니다.

예:

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

알아야 할 사항 플러그인 이벤트 핸들러 함수

플러그인 이벤트 핸들러 함수는 이벤트 핸들러 내에서 발생하는 특정 이벤트에 대한 응답으로 Edge Microgateway는 지정된 API 요청을 처리합니다.

  • init() 함수 핸들러 (ondata_request, ondata_response 등)가 완료되면 next() 콜백을 호출해야 합니다. 가장 적합합니다 next()를 호출하지 않으면 처리가 중단되고 요청이 멈춰버릴 겁니다.
  • next()에 대한 첫 번째 인수는 오류를 일으켜 요청을 사용하여 종료할 수 있습니다
  • ondata_onend_ 핸들러는 타겟에 전달할 데이터를 포함하는 두 번째 인수가 있는 next() 클라이언트일 수 있습니다 플러그인이 버퍼링 중이고 충분한 데이터가 없는 경우 이 인수는 null일 수 있습니다. 있습니다.
  • 플러그인의 단일 인스턴스가 모든 요청과 응답을 처리하는 데 사용됩니다. 플러그인이 호출 사이에 요청별 상태를 유지하려면 해당 상태를 제공된 request 객체 (req)에 추가된 속성이며 전체 기간은 API 호출의 기간입니다.
  • 모든 오류를 포착하고 오류와 함께 next()를 호출해야 합니다. 실패 next()를 호출하면 API 호출이 중단됩니다.
  • 메모리 누수가 발생하지 않도록 주의하세요. Edge의 전반적인 성능에 영향을 줄 수 있습니다. Microgateway를 실행하고 메모리가 부족하면 비정상 종료됩니다.
  • Node.js 모델을 따르도록 주의하여 메인 프로젝트에서 컴퓨팅 집약적인 작업을 수행하지 않도록 합니다. Edge Microgateway의 성능에 부정적인 영향을 줄 수 있기 때문입니다.

플러그인 init() 함수 정보

이 섹션에서는 init() 함수에 전달되는 인수에 대해 설명합니다. config, logger, stats.

config

Edge Microgateway 구성 파일을 다음과 병합한 후 얻은 구성 객체 Apigee Edge에서 다운로드한 정보(예: 제품, 할당량) 다음에서 확인할 수 있습니다. 이 객체의 플러그인별 구성: config.<plugin-name>

값이 fooparam라는 구성 매개변수 추가 응답 재정의라는 플러그인에 추가하려면 default.yaml 파일:

response-override:
    param: foo

이제 다음과 같이 플러그인 코드의 매개변수에 액세스할 수 있습니다.

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

이 경우 플러그인 디버그 출력에 foo가 출력됩니다.

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

logger

시스템 로거 현재 사용하고 있는 로거는 객체가 문자열, HTTP 요청, HTTP 응답 또는 오류 인스턴스가 포함될 수 있습니다

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

stats

요청, 응답, 오류 및 기타 집계된 통계를 보유하는 객체입니다. 요청 및 응답과 관련된 데이터 세트입니다

  • treqErrors - 오류가 있는 타겟 요청 수입니다.
  • treqErrors - 오류가 있는 타겟 응답 수입니다.
  • statusCodes - 응답 코드 수를 포함하는 객체입니다.
{
  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
  }
  
  • 요청 - 총 요청 수입니다.
  • responses - 총 응답 수입니다.
  • connections - 활성 대상 연결 수입니다.

next() 함수 정보

다음 메서드를 계속 처리하려면 모든 플러그인 메서드가 next()를 호출해야 합니다. 플러그인 프로세스가 중단됩니다. 요청 수명 주기에서 호출되는 첫 번째 메서드는 onrequest()를 호출할 수 있습니다. 다음으로 호출할 메서드는 ondata_request() 메서드입니다. 하지만 ondata_request는 다음과 같이 요청에 데이터가 포함된 경우에만 호출됩니다. POST 요청처럼 사용할 수 있습니다 호출되는 다음 메서드는 onend_request(): 요청 처리가 완료되면 호출됩니다. 이 onerror_* 함수는 오류가 발생한 경우에만 호출되며 이를 통해 다음을 수행할 수 있습니다. 원하는 경우 커스텀 코드로 오류를 처리할 수 있습니다.

데이터가 요청으로 전송되고 ondata_request()가 호출된다고 가정해 보겠습니다. 알림 함수가 두 매개변수를 사용하여 next()를 호출합니다.

next(null, data);

규칙에 따라 첫 번째 매개변수는 오류 정보를 전달하는 데 사용되며, 그런 다음 체인의 후속 함수에서 핸들을 처리합니다. null로 설정하면 거짓입니다. 인수에 오류가 없으며 요청 처리가 정상적으로 진행되어야 한다는 의미입니다. 만약 이 인수가 true이면 (예: Error 객체) 요청 처리가 중지되고 요청이 타겟으로 전송됩니다

두 번째 매개변수는 요청 데이터를 체인의 다음 함수로 전달합니다. 설정하지 않은 추가 처리가 없으면 요청 데이터가 변경되지 않은 상태로 API의 대상으로 전달됩니다. 그러나 이 메서드 내에서 요청 데이터를 수정하고 수정된 전송합니다. 예를 들어 요청 데이터가 XML이고 대상이 JSON을 예상하는 경우 그러면 ondata_request() 메서드에 (a) 요청 헤더의 Content-Type을 application/json로 설정하고 요청 데이터를 변환합니다. 원하는 방식으로 JSON에 변환 (예: Node.js NPM에서 가져온 xml2json 변환기).

그 모습을 살펴보겠습니다.

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

이 경우 요청 데이터 (XML로 가정됨)가 JSON으로 변환되고 변환된 데이터는 next()를 통해 요청 체인의 다음 함수로 전달됩니다. 백엔드 타겟으로 전달되기 전에 확인할 수 있습니다

다른 디버그 문을 추가하여 디버깅을 위해 변환된 데이터를 출력할 수 있습니다. 있습니다. 예를 들면 다음과 같습니다.

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

정보 플러그인 핸들러 실행 순서

Edge Microgateway용 플러그인을 작성하는 경우 플러그인의 순서를 이해해야 합니다. 이벤트 핸들러가 실행됩니다

기억해야 할 중요한 점은 에지에서 플러그인 시퀀스를 지정할 때 Microgateway 구성 파일, 요청 핸들러가 오름차순으로 실행됩니다. 응답 핸들러는 내림차순으로 실행됩니다.

다음은 이 실행 순서를 이해하는 데 도움이 되는 예시입니다.

1. 세 개의 간단한 플러그인

다음 플러그인을 살펴보세요. 이벤트 핸들러가 사용 중지되었을 때 출력 콘솔 출력만 호출:

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

이제 다음과 같이 plugin-2plugin-3 플러그인을 두 개 더 만들어 보겠습니다. 동일한 코드 (console.log() 문을 plugin-2로 변경) 각각 plugin-3)을 사용합니다.

2. 플러그인 코드 검토

내보낸 플러그인은 <microgateway-root-dir>/plugins/plugin-1/index.js는 이벤트 핸들러의 요청 및 응답 처리 중 특정 시간에 실행됩니다. 예를 들어 onrequest는 수신된 요청 헤더의 첫 번째 바이트를 실행합니다. 한편, onend_response는 응답 데이터의 마지막 바이트가 수신된 후에 실행됩니다.

ondata_response 핸들러를 살펴보세요. 응답 데이터 청크가 호출될 때마다 호출됩니다. 수신됩니다 알아야 할 중요한 점은 응답 데이터가 항상 합니다. 오히려 데이터는 임의의 길이의 청크로 수신될 수 있습니다.

3. 다음 위치에 플러그인 추가 플러그인 시퀀스는

계속해서 이 예를 통해 Edge의 플러그인 시퀀스에 플러그인을 추가하겠습니다. Microgateway 구성 파일 (~./edgemicro/config.yaml)을 다음과 같이 구성합니다. 시퀀스는 매우 중요합니다. 플러그인 핸들러가 실행되는 순서를 정의합니다.

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

4. 디버그 출력 검토

이제 이러한 플러그인이 호출될 때 생성되는 출력을 살펴보겠습니다. 현재 주목해야 할 몇 가지 중요한 사항은 다음과 같습니다.

  • 플러그인은 Edge Microgateway 구성 파일의 순서를 지정합니다. (~./edgemicro/config.yaml)는 이벤트 핸들러가 실행되는 순서를 지정합니다. 합니다.
  • 요청 핸들러는 오름차순으로 호출됩니다. 1, 2, 3) 순서대로 표시됩니다.
  • 응답 핸들러는 내림차순(3, 2, 1)으로 호출됩니다.
  • ondata_response 핸들러는 다음 조건에 해당하는 데이터 청크마다 한 번씩 호출됩니다. 있습니다. 이 예 (아래 출력 참고)에서는 2개의 청크가 수신됩니다.

다음은 이 세 가지 플러그인이 사용 중이고 요청이 전송되었을 때 생성되는 디버그 출력 샘플입니다 Edge Microgateway를 통해 연결할 수 있습니다 핸들러가 호출되는 순서를 살펴보세요.

  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

요약

플러그인 핸들러가 호출되는 순서를 이해하는 것은 요청 또는 응답의 누적 및 변환과 같은 커스텀 플러그인 기능을 구현할 수 있습니다. 데이터를 수집하는 데 사용됩니다

요청 핸들러는 플러그인이 설정된 순서로 실행된다는 점을 기억하세요. Edge Microgateway 구성 파일에 지정되어 있고 응답 핸들러는 반대 순서입니다.

플러그인에서의 전역 변수 사용 정보

Edge Microgateway에 대한 모든 요청은 동일한 플러그인 인스턴스로 전송됩니다. 각 다른 클라이언트의 두 번째 요청 상태가 첫 번째 요청을 덮어씁니다. 유일하게 안전한 장소는 저장 플러그인 상태는 요청 또는 응답 객체( 전체 기간은 요청의 기간으로 제한됩니다.

플러그인에서 타겟 URL 재작성

추가된 위치: v2.3.3

이러한 변수를 수정하여 플러그인에서 기본 타겟 URL을 동적으로 재정의할 수 있습니다. 플러그인 코드 req.targetHostnamereq.targetPath.

추가된 위치: v2.4.x

대상 엔드포인트 포트를 재정의하고 HTTP와 HTTPS 중에서 선택할 수도 있습니다. 다음 항목 수정 변수(req.targetPort)를 사용해야 합니다. req.targetSecure. HTTPS를 선택하려면 req.targetSecure를 다음으로 설정합니다. true; HTTP의 경우 false로 설정합니다. req.targetSecure를 이 토론을 참조하세요. 대화목록을 참조하세요.

eurekaclient라는 샘플 플러그인이 Edge Microgateway에 추가되었습니다. 이 플러그인은 req.targetPort 및 req.targetSecure 변수를 사용하는 방법을 보여주고, Edge Microgateway가 Eureka를 서비스로 사용하여 동적 엔드포인트 조회를 수행하는 방법을 보여줍니다. 엔드포인트 카탈로그를 사용하는 것이 좋습니다


샘플 플러그인

이 플러그인은 Edge Microgateway 설치 시 제공됩니다. 다음에서 확인할 수 있습니다. Edge Microgateway 설치 위치:

[prefix]/lib/node_modules/edgemicro/plugins

여기서 [prefix]는 다음과 같은 npm 접두사 디렉터리입니다. 'Edge Microgateway 설치 위치'에 설명되어 있음 Edge 설치에 Microgateway를 제공합니다.

accumulate-request

이 플러그인은 클라이언트에서 데이터 청크를 요청 객체를 지정합니다. 모든 요청 데이터가 수신되면 배열은 버퍼에 연결됩니다. 이는 시퀀스의 다음 플러그인으로 전달됩니다. 이 플러그인이 첫 번째 플러그인이어야 합니다. 이후 플러그인이 누적된 요청 데이터를 수신할 수 있도록 합니다.

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

이 플러그인은 대상의 데이터 청크를 응답 객체가 됩니다. 모든 응답 데이터가 수신되면 배열은 버퍼에 연결됩니다. 이는 시퀀스의 다음 플러그인으로 전달됩니다. 이 플러그인은 기본적으로 역순으로 처리되는 경우 해당 응답을 마지막 플러그인으로 배치해야 합니다. 순서대로 복사됩니다.

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 플러그인

Edge Microgateway 배포에는 <microgateway-root-dir>/plugins/header-uppercase 샘플에는 주석이 포함되어 있습니다. 확인할 수 있습니다. 이 샘플은 클라이언트 요청과 타겟 응답에 커스텀 헤더를 추가합니다.

다음은 <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();
    }

  };

}

변환-대문자

이 플러그인은 어떤 유형의 작업을 하든지 수정할 수 있는 일반 변환 플러그인입니다. 수행할 수 있습니다. 이 예시에서는 응답과 요청 데이터를 대문자여야 합니다.

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

  };

}