연습 - Azure Functions 앱을 위한 함수 생성

완료됨

이 단원에서는 Node.js Express 앱의 GET, POST, PUTDELETE 엔드포인트를 대상으로, Azure Functions 앱에서 함수를 만들고 구성합니다.

GET 함수에 데이터 액세스 추가

마지막 단원에서 Azure Functions 앱을 만들 때 첫 번째 API 엔드포인트를 만들었습니다. 이 함수는 HTTP GET/vacations에서 요청되면 실행됩니다. 휴가를 가져오기 위해 데이터 서비스를 호출하도록 상용구 코드를 업데이트해야 합니다.

  1. functions/src/functions/getVacations.ts 파일을 엽니다.

  2. 두 파일을 나란히 볼 수 있도록 별도의 창에서 서버/경로/vacation.routes.ts 파일을 엽니다.

  3. getVacations.ts vacationService import 문을 추가합니다.

    import { vacationService } from '../services';
    
  4. getVacations.ts 함수를 getVacations 편집하여 vacationService를 호출합니다.

     export async function getVacations(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
         context.log(`Http function processed request for url "${request.url}"`);
         return { jsonBody: vacationService.getVacations() }; // Data access logic within the return object
     };
    
  5. 거기서 멈출 수 있습니다. 휴가를 가져오기 위해 함수에 추가해야 하는 유일한 코드입니다. 그러나 오류를 처리하고 상태 코드를 반환하는 코드도 제공해야 합니다. 다음 코드를 사용하도록 함수를 업데이트합니다.

     export async function getVacations(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
       context.log(`Http function processed request for url "${request.url}"`);
    
       try {
         const vacations = vacationService.getVacations();  // Data access logic
    
         if (vacations) {
           return {
             status: 200,
             jsonBody: vacations
           };
         } else {
           return {
             status: 404,
             jsonBody: {
               error: 'No vacations found'
             }
           };
         }      
       } catch (error: unknown) {
         const err = error as Error;
         context.error(`Error listing vacations: ${err.message}`);
    
         return {
           status: 500,
           jsonBody: {
             error: 'Failed to list vacations'
           }
         };
       }
     };
    

Azure Functions 경로 구성

v4 프로그래밍 모델에서는 여러 가지 방법으로 경로를 구성할 수 있습니다. 경로 정의는 경로 처리기를 단일 파일에 그대로 둘 수 있습니다. 하나의 엔드포인트가 있는 애플리케이션에 적합합니다. Tailwind Traders의 개발자는 이 애플리케이션이 구성해야 하는 많은 API로 확장될 것임을 알고 있습니다.

  1. 해당 조직을 시작하려면 경로 정의를 캡처하는 새 ./functions/src/index.ts 파일을 만듭니다.

  2. 패키지에서 제공하는 앱에 대한 종속성을 추가합니다 @azure/functions .

    import { app } from '@azure/functions';
    
  3. 파일에서 ./functions/getVacations getVacations 함수에 대한 종속성을 추가합니다.

    import { getVacations } from `./functions/getVacations`;
    
  4. 경로 정의를 ./functions/getVacations index.ts 파일로 이동합니다. 메서드 속성 배열을 .로 업데이트합니다GET.

    app.http('getVacations', {
        methods: ['GET'],
        route: 'vacations',
        authLevel: 'anonymous',
        handler: getVacations
    });
    

함수 및 처리기 이름 지정

이름은 getVacations app.http에 대한 첫 번째 매개 변수와 두 번째 매개 변수의 속성으로 사용됩니다. 이는 혼란스러울 수 있으며 이름 사용 방법에 따라 조직이나 팀에서 다른 명명 규칙을 원할 수 있습니다.

Screenshot of the http definition with the first parameter numbered as one, and the second parameter's handler property numbered as two.

  • 첫 번째 매개 변수 - 문자열로 이름: 첫 번째 매개 변수의 값은 Azure Portal에 표시될 함수의 이름입니다. 이러한 이름은 포털에 영숫자로 나열되므로 유사한 함수를 목적에 따라 그룹화하거나 메서드(예getVacation: vacationGet 메서드)로 그룹화하는 명명 규칙을 사용할 수 있습니다. snake_case, 케밥 케이스 또는 camelCase와 같은 다른 사례를 선택할 수도 있습니다.
  • 두 번째 매개 변수 - 처리기 함수: 두 번째 매개 변수의 값은 코드에서 가져오고 사용될 때 함수 처리기의 이름입니다. 이 이름은 설명적이어야 하며 함수의 목적과 일치해야 합니다. 코드 베이스의 함수에 대해 이미 가지고 있는 명명 규칙을 준수할 수 있으며 일반적인 코드 규칙 도구를 사용하여 적용할 수 있습니다.

나머지 함수 만들기

Node.js Express 애플리케이션에는 네 개의 엔드포인트가 있으며, 방금 만든 것은 GET 엔드포인트용 함수입니다. 지금부터는 나머지 경로 엔드포인트에 대한 함수를 만듭니다.

메서드 HTTP 트리거 이름 경로
POST postVacation vacations
PUT updateVacation vacations/{id}
DELETE deleteVacation vacations/{id}

GET 및 POST 경로는 동일하지만 및 DELETE 경로는 PUT 매개 변수를 사용하여 사용할 휴가를 식별합니다.

HTTP POST 함수 만들기

휴가 추가를 처리하는 POST 함수를 만듭니다.

  1. Visual Studio Code에서 Ctrl Shift +P를 사용하여 명령 팔레트를 + 열고 Enter Azure Functions: Create Function키를 누릅니다.

  2. HTTP 트리거를 형식으로 선택하고 postVacation을 이름으로 선택합니다.

  3. 파일에 vacationService import 문을 추가합니다.

    import { vacationService } from '../services';
    
  4. 상용구 postVacation 함수를 데이터 액세스 및 오류 처리를 위한 다음 코드로 바꿉다.

    export async function postVacation(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
        context.log(`HTTP function processed request for URL: "${request.url}"`);
    
        try {
            const vacation = await request.json() as Vacation;
    
            // Validate the vacation object
            if (!vacation || typeof vacation !== 'object' || !vacation.name || !vacation.description) {
                return {
                    status: 400,
                    jsonBody: { 
                        error: 'Invalid or missing vacation data.' 
                    }
                };
            }
    
            // Data access logic
            const newVacation = vacationService.addVacation(vacation); 
    
            // Successfully added the vacation
            return {
                status: 201,
                jsonBody: newVacation
            };
        } catch (error: unknown) {
            const err = error as Error;
            context.error(`Error create vacation: ${err.message}`);
    
            return {
                status: 500,
                jsonBody: {
                    error: 'Failed to create vacation'
                }
            };
        }
    }
    

    들어오는 휴가 데이터를 읽으려면 이 메서드를 request.json() 사용합니다. 이 메서드는 요청 본문의 JSON 데이터로 확인되는 프라미스를 반환합니다. 그런 다음 키워드(keyword) 사용하여 await 약속이 해결될 때까지 기다립니다. 구문은 as Vacation TypeScript에 결과를 개체로 처리하도록 지시하는 형식 어설션입니다 Vacation .

    const vacation = await request.json() as Vacation;
    
  5. postVacation 파일에서 index.ts 파일로 경로 정의를 이동합니다. 메서드 속성 배열을 .로 업데이트합니다 POST.

    app.http('post-vacation', {
        methods: ['POST'],
        route: 'vacations',
        authLevel: 'anonymous',
        handler: postVacation
    });
    

HTTP PUT 함수 만들기

휴가 추가를 처리하는 PUT 함수를 만듭니다.

  1. Visual Studio Code에서 Ctrl Shift + P를 사용하여 명령 팔레트를 + 열고 Enter Azure Functions: Create Function키를 누릅니다.

  2. 형식으로 HTTP 트리거를 선택하고 이름으로 updateVacation을 선택합니다.

  3. 파일에 vacationService import 문을 추가합니다.

    import { vacationService } from '../services';
    
  4. 상용구 updateVacation 함수를 데이터 액세스 및 오류 처리를 위한 다음 코드로 바꿉다.

    export async function updateVacation(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
      try {
        const id = request.params.id;
        const { name, description } = await request.json() as Vacation;
    
        // Data access logic
        const updatedVacation = vacationService.updateVacation({ id, name, description });
    
        if (updatedVacation !== undefined) {
          return {
            status: 200,
            jsonBody: {
              updatedVacation
            }
          };
        } else {
          return {
            status: 404,
            jsonBody: {
              error: `Vacation with ID ${id} not found`
            }
          };
        }
      } catch (error: unknown) {
        const err = error as Error;
        context.error(`Error updating vacation: ${err.message}`);
    
        return {
          status: 500,
          jsonBody: {
            error: 'Failed to update vacation'
          }
        };
      }
    };
    

    request.params.id 속성은 URL에서 휴가 ID를 가져오는 데 사용됩니다. 이 request.json() 메서드는 요청 본문에서 휴가 데이터를 가져오는 데 사용됩니다. 구문은 as Vacation TypeScript에 결과를 개체로 처리하도록 지시하는 형식 어설션입니다 Vacation .

  5. putVacation 파일에서 index.ts 파일로 경로 정의를 이동합니다. 메서드 속성 배열을 .로 업데이트합니다 PUT.

    app.http('updateVacation', {
        methods: ['PUT'],
        route: 'vacations/{id}',
        authLevel: 'anonymous',
        handler: updateVacation
    });
    

HTTP DELETE 함수 만들기

휴가 추가를 처리하는 DELETE 함수를 만듭니다.

  1. Visual Studio Code에서 Ctrl Shift + P를 사용하여 명령 팔레트를 + 열고 Enter Azure Functions: Create Function키를 누릅니다.

  2. 형식으로 HTTP 트리거를 선택하고 이름으로 deleteVacation을 선택합니다.

  3. 파일에 vacationService 가져오기를 추가합니다.

    import { vacationService } from '../services';
    
  4. 상용구 deleteVacation 함수를 데이터 액세스 및 오류 처리를 위한 다음 코드로 바꿉다.

    export async function deleteVacation(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
      context.log(`Http function processed request for url "${request.url}"`);
    
      try {
    
        const id = request.params.id;
    
        if (!id) {
          return {
            status: 400,
            jsonBody: {
              error: 'ID parameter is required'
            }
          };
        }
    
        const deletedVacation = vacationService.deleteVacation(id);
    
        if (deletedVacation) {
          return {
            status: 204,
            jsonBody: {
              deleteVacation
            }
          };
        } else {
          return {
            status: 404,
            jsonBody: {
              error: `Vacation with ID ${id} not found`
            }
          };
        }
      } catch (error: unknown) {
        const err = error as Error;
        context.error(`Error deleting vacation: ${err.message}`);
    
        return {
          status: 500,
          jsonBody: {
            error: 'Failed to delete vacation'
          }
        };
      }
    };
    

    request.params.id 속성은 URL에서 휴가 ID를 가져오는 데 사용됩니다.

  5. deleteVacation 파일에서 index.ts 파일로 경로 정의를 이동합니다. 메서드 속성 배열을 .로 업데이트합니다 DELETE.

    app.http('deleteVacation', {
        methods: ['DELETE'],
        route: 'vacations/{id}',
        authLevel: 'anonymous',
        handler: deleteVacation
    });
    

다음 단원으로 이동하여, 앞에서 만든 Azure Functions 애플리케이션을 검토합니다.