Ćwiczenie — tworzenie funkcji dla aplikacji usługi Azure Functions

Ukończone

W tej lekcji utworzysz i skonfigurujesz funkcje w aplikacji usługi Azure Functions dla GETpunktów końcowych , POST, PUTi DELETE w aplikacji Node.js Express.

Dodawanie dostępu do danych do funkcji GET

Pierwszy punkt końcowy interfejsu API został utworzony podczas tworzenia aplikacji usługi Azure Functions w ostatniej lekcji. Ta funkcja jest wykonywana, gdy żądanie HTTP GET jest wykonywane na ./vacations Musisz zaktualizować standardowy kod, aby wywołać usługę danych, aby uzyskać urlopy.

  1. Otwórz plik functions/src/functions/getVacations.ts.

  2. Otwórz plik server/routes/vacation.routes.ts w osobnym oknie, aby zobaczyć oba pliki obok siebie.

  3. W getVacations.ts dodaj instrukcję vacationService import.

    import { vacationService } from '../services';
    
  4. W getVacations.ts edytuj getVacations funkcję , aby wywołać funkcję 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. Możesz się tam zatrzymać. Jest to jedyny kod, który należy dodać do funkcji, aby uzyskać urlopy. Należy jednak również podać kod do obsługi błędów i zwracania kodu stanu. Zaktualizuj funkcję, aby użyć następującego kodu.

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

Organizowanie tras usługi Azure Functions

W modelu programowania w wersji 4 można organizować trasy na kilka sposobów. Definicję trasy można pozostawić z procedurą obsługi tras w jednym pliku. Jest to odpowiednie w przypadku aplikacji z jednym punktem końcowym. Jako deweloper w firmie Tailwind Traders wiesz, że ta aplikacja będzie rozwijać się do wielu interfejsów API, które muszą być zorganizowane.

  1. Aby rozpocząć tę organizację, utwórz nowy ./functions/src/index.ts plik, aby przechwycić definicje tras.

  2. Dodaj zależność dla aplikacji dostarczonej @azure/functions z pakietu.

    import { app } from '@azure/functions';
    
  3. Dodaj zależność dla funkcji getVacations z ./functions/getVacations pliku.

    import { getVacations } from `./functions/getVacations`;
    
  4. Przenieś definicję trasy z ./functions/getVacations do pliku index.ts . Zaktualizuj tablicę właściwości metody na GET.

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

Nazewnictwo funkcji i procedury obsługi

Nazwa getVacations jest używana zarówno jako pierwszy parametr do app.http , jak i jako właściwość w drugim parametrze. Może to być mylące i może być potrzebne różne reguły nazewnictwa w organizacji lub zespole, w zależności od sposobu użycia nazwy.

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

  • Pierwszy parametr — nazwa jako ciąg: wartość pierwszego parametru to nazwa funkcji, która będzie wyświetlana w witrynie Azure Portal. Te nazwy są wymienione alfanumerycznie w portalu, dlatego warto użyć konwencji nazewnictwa, która grupuje podobne funkcje w celach, takich jak lub według metod, takich jak vacationGetgetVacation. Możesz również wybrać inny przypadek, taki jak snake_case, kebab-case lub camelCase.
  • Drugi parametr — funkcja obsługi: wartość drugiego parametru to nazwa programu obsługi funkcji, która jest importowana i używana w kodzie. Ta nazwa powinna być opisowa i zgodna z celem funkcji. Może ona być zgodna z konwencjami nazewnictwa, które są już dostępne w bazie kodu i może być wymuszana za pomocą typowych narzędzi zgodności kodu.

Tworzenie pozostałych funkcji

W aplikacji Node.js Express znajdują się cztery punkty końcowe i właśnie utworzono funkcję dla punktu końcowego GET . Teraz utwórz funkcje dla pozostałych punktów końcowych trasy.

Method Nazwa wyzwalacza HTTP Marszruta
POST postVacation vacations
PUT updateVacation vacations/{id}
DELETE deleteVacation vacations/{id}

Chociaż trasy GET i POST są takie same. Trasy PUT i DELETE używają parametru , aby określić, które urlopy mają być używane.

Tworzenie funkcji HTTP POST

POST Utwórz funkcję, która obsługuje dodawanie urlopu.

  1. W programie Visual Studio Code otwórz paletę poleceń za pomocą klawiszy Ctrl + Shift +P i wpisz Azure Functions: Create Function i naciśnij klawisz Enter.

  2. Wybierz pozycję Wyzwalacz HTTP jako typ, a jako nazwę wybierz pozycję PostVacation .

  3. Dodaj instrukcję vacationService import do pliku.

    import { vacationService } from '../services';
    
  4. Zastąp funkcję boilerplate postVacation następującym kodem umożliwiającym dostęp do danych i obsługę błędów.

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

    Aby odczytać przychodzące dane urlopowe, użyj request.json() metody . Ta metoda zwraca obietnicę, która rozpoznaje dane JSON w treści żądania. Następnie użyj słowa kluczowego await , aby poczekać na rozwiązanie obietnicy. Składnia as Vacation jest asercją typu, która informuje język TypeScript o traktowaniu wyniku jako Vacation obiektu.

    const vacation = await request.json() as Vacation;
    
  5. Przenieś definicję trasy z pliku postVacation do pliku index.ts . Zaktualizuj tablicę właściwości metody na POST.

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

Tworzenie funkcji HTTP PUT

PUT Utwórz funkcję, która obsługuje dodawanie urlopu.

  1. W programie Visual Studio Code otwórz paletę poleceń za pomocą klawiszy Ctrl + Shift + P i wpisz Azure Functions: Create Function i naciśnij klawisz Enter.

  2. Wybierz pozycję Wyzwalacz HTTP jako typ i zaktualizujVacation jako nazwę.

  3. Dodaj instrukcję vacationService import do pliku.

    import { vacationService } from '../services';
    
  4. Zastąp funkcję boilerplate updateVacation następującym kodem umożliwiającym dostęp do danych i obsługę błędów.

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

    Właściwość request.params.id służy do pobierania identyfikatora urlopu z adresu URL. Metoda request.json() służy do pobierania danych urlopowych z treści żądania. Składnia as Vacation jest asercją typu, która informuje język TypeScript o traktowaniu wyniku jako Vacation obiektu.

  5. Przenieś definicję trasy z pliku putVacation do pliku index.ts . Zaktualizuj tablicę właściwości metody na PUT.

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

Tworzenie funkcji HTTP DELETE

DELETE Utwórz funkcję, która obsługuje dodawanie urlopu.

  1. W programie Visual Studio Code otwórz paletę poleceń za pomocą klawiszy Ctrl + Shift + P i wpisz Azure Functions: Create Function i naciśnij klawisz Enter.

  2. Wybierz pozycję Wyzwalacz HTTP jako typ i usuńVacation jako nazwę.

  3. Dodaj import vacationService do pliku.

    import { vacationService } from '../services';
    
  4. Zastąp funkcję boilerplate deleteVacation następującym kodem umożliwiającym dostęp do danych i obsługę błędów.

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

    Właściwość request.params.id służy do pobierania identyfikatora urlopu z adresu URL.

  5. Przenieś definicję trasy z pliku deleteVacation do pliku index.ts . Zaktualizuj tablicę właściwości metody na DELETE.

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

Przejdź do następnej lekcji, aby przejrzeć utworzoną aplikację usługi Azure Functions.