Latihan - Membuat fungsi untuk aplikasi Azure Functions

Selesai

Di unit ini, Anda membuat dan mengonfigurasi fungsi di aplikasi Azure Functions untuk GETtitik akhir , , POSTPUT, dan DELETE di aplikasi Node.js Express.

Menambahkan akses data ke fungsi GET

Anda membuat titik akhir API pertama saat membuat aplikasi Azure Functions di unit terakhir. Fungsi ini dijalankan ketika HTTP GET diminta pada /vacations. Anda perlu memperbarui kode boilerplate untuk memanggil layanan data untuk mendapatkan liburan.

  1. Buka file functions/src/functions/getVacations.ts.

  2. Buka file server/routes/vacation.routes.ts di jendela terpisah sehingga Anda dapat melihat kedua file berdampingan.

  3. Di getVacations.ts, tambahkan pernyataan impor vacationService.

    import { vacationService } from '../services';
    
  4. Di getVacations.ts, edit getVacations fungsi untuk memanggil 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. Kau bisa berhenti di sana. Itulah satu-satunya kode yang perlu Anda tambahkan ke fungsi untuk mendapatkan liburan. Namun, Anda juga harus memberikan kode untuk menangani kesalahan dan mengembalikan kode status. Perbarui fungsi untuk menggunakan kode berikut.

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

Mengatur rute Azure Functions

Dalam model pemrograman v4, Anda dapat mengatur rute dengan beberapa cara. Anda dapat meninggalkan definisi rute dengan handler rute dalam satu file. Ini baik-baik saja untuk aplikasi dengan satu titik akhir. Sebagai pengembang di Tailwind Traders, Anda tahu aplikasi ini akan tumbuh ke banyak API yang perlu diatur.

  1. Untuk memulai organisasi tersebut, buat file baru ./functions/src/index.ts untuk mengambil definisi rute.

  2. Tambahkan dependensi untuk aplikasi yang disediakan dari @azure/functions paket.

    import { app } from '@azure/functions';
    
  3. Tambahkan dependensi untuk fungsi getVacations dari ./functions/getVacations file.

    import { getVacations } from `./functions/getVacations`;
    
  4. Pindahkan definisi rute dari ./functions/getVacations ke file index.ts . Perbarui array properti metode ke GET.

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

Penamaan fungsi dan handler

Nama getVacations ini digunakan sebagai parameter pertama ke app.http dan sebagai properti di parameter kedua. Ini mungkin membingungkan dan Anda mungkin menginginkan aturan penamaan yang berbeda di organisasi atau tim Anda, tergantung pada bagaimana nama tersebut digunakan.

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

  • Parameter pertama - nama sebagai string: Nilai untuk parameter pertama adalah nama fungsi seperti yang akan muncul di portal Azure. Nama-nama tersebut tercantum secara alfanumerik di portal, jadi Anda mungkin ingin menggunakan konvensi penamaan yang mengelompokkan fungsi serupa bersama-sama berdasarkan tujuan, seperti vacationGet atau dengan metode, seperti getVacation. Anda juga dapat memilih kasus yang berbeda seperti snake_case, kebab-case, atau camelCase.
  • Parameter kedua - fungsi handler: Nilai untuk parameter kedua adalah nama handler fungsi seperti yang diimpor dan digunakan dalam kode. Nama ini harus deskriptif dan cocok dengan tujuan fungsi. Ini dapat sesuai dengan konvensi penamaan yang sudah Anda miliki untuk fungsi di basis kode Anda dan dapat diberlakukan dengan alat kesamaan kode umum.

Membuat fungsi yang tersisa

Ada empat titik akhir dalam aplikasi Node.js Express, dan Anda baru saja membuat fungsi untuk GET titik akhir. Sekarang buat fungsi untuk titik akhir rute yang tersisa.

Metode Nama pemicu HTTP Rute
POST postVacation vacations
PUT updateVacation vacations/{id}
DELETE deleteVacation vacations/{id}

Sementara rute GET dan POST sama. PUT Rute dan DELETE menggunakan parameter untuk mengidentifikasi liburan mana yang akan digunakan.

Membuat fungsi HTTP POST

POST Buat fungsi yang menangani penambahan liburan.

  1. Di Visual Studio Code, buka palet perintah dengan Ctrl + Shift +P dan ketik Azure Functions: Create Function dan tekan Enter.

  2. Pilih Pemicu HTTP sebagai jenis, dan postVacation sebagai nama.

  3. Tambahkan pernyataan impor vacationService ke file.

    import { vacationService } from '../services';
    
  4. Ganti fungsi boilerplate postVacation dengan kode berikut untuk akses data dan penanganan kesalahan.

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

    Untuk membaca data liburan masuk, Anda menggunakan metode .request.json() Metode ini mengembalikan janji yang diselesaikan ke data JSON dalam isi permintaan. Anda kemudian menggunakan await kata kunci untuk menunggu janji diselesaikan. Sintaks as Vacation adalah pernyataan jenis yang memberi tahu TypeScript untuk memperlakukan hasilnya sebagai Vacation objek.

    const vacation = await request.json() as Vacation;
    
  5. Pindahkan definisi rute dari file postVacation ke file index.ts . Perbarui array properti metode ke POST.

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

Membuat fungsi HTTP PUT

PUT Buat fungsi yang menangani penambahan liburan.

  1. Di Visual Studio Code, buka palet perintah dengan Ctrl + Shift + P dan ketik Azure Functions: Create Function dan tekan Enter.

  2. Pilih Pemicu HTTP sebagai jenis, dan updateVacation sebagai nama.

  3. Tambahkan pernyataan impor vacationService ke file.

    import { vacationService } from '../services';
    
  4. Ganti fungsi boilerplate updateVacation dengan kode berikut untuk akses data dan penanganan kesalahan.

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

    Properti request.params.id digunakan untuk mendapatkan ID liburan dari URL. Metode request.json() ini digunakan untuk mendapatkan data liburan dari isi permintaan. Sintaks as Vacation adalah pernyataan jenis yang memberi tahu TypeScript untuk memperlakukan hasilnya sebagai Vacation objek.

  5. Pindahkan definisi rute dari file putVacation ke file index.ts . Perbarui array properti metode ke PUT.

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

Membuat fungsi HTTP DELETE

DELETE Buat fungsi yang menangani penambahan liburan.

  1. Di Visual Studio Code, buka palet perintah dengan Ctrl + Shift + P dan ketik Azure Functions: Create Function dan tekan Enter.

  2. Pilih Pemicu HTTP sebagai jenis, dan deleteVacation sebagai nama.

  3. Tambahkan vacationService import ke file.

    import { vacationService } from '../services';
    
  4. Ganti fungsi boilerplate deleteVacation dengan kode berikut untuk akses data dan penanganan kesalahan.

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

    Properti request.params.id digunakan untuk mendapatkan ID liburan dari URL.

  5. Pindahkan definisi rute dari file deleteVacation ke file index.ts . Perbarui array properti metode ke DELETE.

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

Buka unit berikutnya untuk meninjau aplikasi Azure Functions yang Anda buat.