6.5. TypeScript 함수 개발
TypeScript 함수 프로젝트를 생성한 후에는 제공된 템플릿 파일을 수정하여 비즈니스 로직을 함수에 추가할 수 있습니다. 여기에는 함수 호출 및 반환된 헤더 및 상태 코드가 포함됩니다.
6.5.1. 사전 요구 사항
- 함수를 개발하려면 먼저 OpenShift Serverless Functions 설정 단계를 완료해야 합니다.
6.5.2. TypeScript 함수 템플릿 구조
Knative(kn
) CLI를 사용하여 TypeScript 함수를 생성할 때 프로젝트 디렉터리는 일반적인 TypeScript 프로젝트와 같습니다. 유일한 예외는 함수를 구성하는 데 사용되는 추가 func.yaml
파일입니다.
http
및 event
트리거 함수 모두 동일한 템플릿 구조를 갖습니다.
템플릿 구조
. ├── func.yaml 1 ├── package.json 2 ├── package-lock.json ├── README.md ├── src │ └── index.ts 3 ├── test 4 │ ├── integration.ts │ └── unit.ts └── tsconfig.json
- 1
func.yaml
구성 파일은 이미지 이름과 레지스트리를 결정하는 데 사용됩니다.- 2
- 템플릿
package.json
파일에 제공된 종속성으로 제한되지 않습니다. 다른 TypeScript 프로젝트에서와 마찬가지로 종속 항목을 추가할 수 있습니다.npm 종속성 추가 예
npm install --save opossum
프로젝트가 배포용으로 빌드되면 이러한 종속 항목은 생성된 런타임 컨테이너 이미지에 포함됩니다.
- 3
- 프로젝트에는
handle
라는 함수를 내보내는src/index.js
파일이 포함되어야 합니다. - 4
- 통합 및 테스트 스크립트는 함수 템플릿의 일부로 제공됩니다.
6.5.3. TypeScript 함수 호출 정보
Knative(kn
) CLI를 사용하여 함수 프로젝트를 생성할 때 CloudEvents에 응답하는 프로젝트 또는 간단한 HTTP 요청에 응답하는 프로젝트를 생성할 수 있습니다. Knative의 CloudEvents는 HTTP를 통해 POST 요청으로 전송되므로 함수 유형 모두 수신되는 HTTP 이벤트를 수신하고 응답합니다.
간단한 HTTP 요청을 사용하여 TypeScript 함수를 호출할 수 있습니다. 들어오는 요청이 수신되면 context
오브젝트를 첫 번째 매개 변수로 사용하여 함수가 호출됩니다.
6.5.3.1. TypeScript 컨텍스트 오브젝트
함수를 호출하려면 context
오브젝트를 첫 번째 매개변수로 제공합니다. 컨텍스트
오브젝트의 속성에 액세스하면 들어오는 HTTP 요청에 대한 정보를 제공할 수 있습니다.
컨텍스트 오브젝트의 예
function handle(context:Context): string
이 정보에는 HTTP 요청 메서드, 요청, HTTP 버전, 요청 본문으로 전송된 모든 쿼리 문자열 또는 헤더가 포함됩니다. CloudEvent
가 포함된 들어오는 요청은 context.cloudevent
를 사용하여 액세스할 수 있도록 CloudEvent의 들어오는 인스턴스를 컨텍스트 오브젝트에 연결합니다.
6.5.3.1.1. 컨텍스트 오브젝트 메서드
context
오브젝트에는 데이터 값을 수락하고 CloudEvent를 반환하는 단일 메서드 cloudEventResponse()
가 있습니다.
Knative 시스템에서 서비스로 배포된 함수가 CloudEvent를 보내는 이벤트 브로커에 의해 호출되는 경우 브로커는 응답을 확인합니다. 응답이 CloudEvent인 경우 브로커가 이 이벤트를 처리합니다.
컨텍스트 오브젝트 메서드 예
// Expects to receive a CloudEvent with customer data export function handle(context: Context, cloudevent?: CloudEvent): CloudEvent { // process the customer const customer = cloudevent.data; const processed = processCustomer(customer); return context.cloudEventResponse(customer) .source('/customer/process') .type('customer.processed') .response(); }
6.5.3.1.2. 컨텍스트 유형
TypeScript 유형 정의 파일은 함수에 사용하기 위해 다음 유형을 내보냅니다.
내보낸 유형 정의
// Invokable is the expeted Function signature for user functions export interface Invokable { (context: Context, cloudevent?: CloudEvent): any } // Logger can be used for structural logging to the console export interface Logger { debug: (msg: any) => void, info: (msg: any) => void, warn: (msg: any) => void, error: (msg: any) => void, fatal: (msg: any) => void, trace: (msg: any) => void, } // Context represents the function invocation context, and provides // access to the event itself as well as raw HTTP objects. export interface Context { log: Logger; req: IncomingMessage; query?: Record<string, any>; body?: Record<string, any>|string; method: string; headers: IncomingHttpHeaders; httpVersion: string; httpVersionMajor: number; httpVersionMinor: number; cloudevent: CloudEvent; cloudEventResponse(data: string|object): CloudEventResponse; } // CloudEventResponse is a convenience class used to create // CloudEvents on function returns export interface CloudEventResponse { id(id: string): CloudEventResponse; source(source: string): CloudEventResponse; type(type: string): CloudEventResponse; version(version: string): CloudEventResponse; response(): CloudEvent; }
6.5.3.1.3. CloudEvent 데이터
들어오는 요청이 CloudEvent인 경우 CloudEvent와 관련된 모든 데이터가 이벤트에서 추출되며 두 번째 매개변수로 제공됩니다. 예를 들어 데이터 속성에 다음과 유사한 JSON 문자열이 포함된 CloudEvent가 수신되는 경우 다음과 같이 됩니다.
{ "customerId": "0123456", "productId": "6543210" }
호출될 때 context
오브젝트 다음에 함수에 대한 두 번째 매개 변수는 customerId
및 productId
속성이 있는 JavaScript 오브젝트가 됩니다.
서명 예
function handle(context: Context, cloudevent?: CloudEvent): CloudEvent
이 예제의 cloudevent
매개 변수는 customerId
및 productId
속성이 포함된 JavaScript 오브젝트입니다.
6.5.4. TypeScript 함수 반환 값
함수는 유효한 JavaScript 유형을 반환하거나 반환 값이 없을 수 있습니다. 함수에 반환 값이 지정되지 않고 실패가 표시되지 않으면 호출자는 204 No Content
응답을 받습니다.
또한 함수는 이벤트를 Knative Eventing 시스템으로 푸시하기 위해 CloudEvent 또는 Message
오브젝트를 반환할 수 있습니다. 이 경우 개발자는 CloudEvent 메시징 사양을 이해하고 구현할 필요가 없습니다. 반환된 값의 헤더 및 기타 관련 정보는 추출된 응답으로 전송됩니다.
예
export const handle: Invokable = function ( context: Context, cloudevent?: CloudEvent ): Message { // process customer and return a new CloudEvent const customer = cloudevent.data; return HTTP.binary( new CloudEvent({ source: 'customer.processor', type: 'customer.processed' }) ); };
6.5.4.1. 헤더 반환
return
오브젝트에 headers
속성을 추가하여 응답 헤더를 설정할 수 있습니다. 이러한 헤더는 추출된 호출에 대한 응답으로 전송됩니다.
응답 헤더의 예
export function handle(context: Context, cloudevent?: CloudEvent): Record<string, any> { // process customer and return custom headers const customer = cloudevent.data as Record<string, any>; return { headers: { 'customer-id': customer.id } }; }
6.5.4.2. 상태 코드 반환
statusCode
속성을 return
오브젝트에 추가하여 호출자에게 반환된 상태 코드를 설정할 수 있습니다.
상태 코드 예
export function handle(context: Context, cloudevent?: CloudEvent): Record<string, any> { // process customer const customer = cloudevent.data as Record<string, any>; if (customer.restricted) { return { statusCode: 451 } } // business logic, then return { statusCode: 240 } }
상태 코드는 함수에서 생성되어 발생하는 오류에 대해 설정할 수 있습니다.
오류 상태 코드의 예
export function handle(context: Context, cloudevent?: CloudEvent): Record<string, string> { // process customer const customer = cloudevent.data as Record<string, any>; if (customer.restricted) { const err = new Error(‘Unavailable for legal reasons’); err.statusCode = 451; throw err; } }
6.5.5. TypeScript 함수 테스트
TypeScript 함수는 컴퓨터에서 로컬에서 테스트할 수 있습니다. kn func create
를 사용하여 함수를 만들 때 생성되는 기본 프로젝트에는 몇 가지 간단한 단위 및 통합 테스트가 포함된 테스트 폴더가 있습니다.
사전 요구 사항
- OpenShift Serverless Operator 및 Knative Serving이 클러스터에 설치되어 있습니다.
-
Knative(
kn
) CLI가 설치되어 있습니다. -
kn func create
를 사용하여 함수를 생성했습니다.
절차
이전에 테스트를 실행하지 않은 경우 먼저 종속성을 설치합니다.
$ npm install
- 함수의 테스트 폴더로 이동합니다.
테스트를 실행합니다.
$ npm test
6.5.6. 다음 단계
- TypeScript 컨텍스트 오브젝트 참조 설명서를 참조하십시오.
- 함수를 빌드 및 배포합니다.
- 함수 로깅에 대한 자세한 내용은 Pino API 설명서 를 참조하십시오.