Bermigrasi ke versi 4 dari model pemrograman Node.js untuk Azure Functions

Artikel ini membahas perbedaan antara versi 3 dan versi 4 dari model pemrograman Node.js dan cara meningkatkan aplikasi v3 yang ada. Jika Anda ingin membuat aplikasi v4 baru alih-alih memutakhirkan aplikasi v3 yang ada, lihat tutorial untuk Visual Studio Code (VS Code) atau Azure Functions Core Tools. Artikel ini menggunakan pemberitahuan "tip" untuk menyoroti tindakan konkret terpenting yang harus Anda ambil untuk meningkatkan aplikasi Anda.

Versi 4 dirancang untuk memberi pengembang Node.js manfaat berikut:

  • Berikan pengalaman yang akrab dan intuitif kepada pengembang Node.js.
  • Jadikan struktur file fleksibel dengan dukungan untuk penyesuaian penuh.
  • Beralih ke pendekatan yang berpusat pada kode untuk menentukan konfigurasi fungsi.

Pertimbangan

  • Model pemrograman Node.js tidak boleh dikacaukan dengan runtime Bahasa Umum Azure Functions:
    • Model pemrograman: Menentukan bagaimana Anda menulis kode Anda dan khusus untuk JavaScript dan TypeScript.
    • Runtime: Menentukan perilaku yang mendasari Azure Functions dan dibagikan di semua bahasa.
  • Versi model pemrograman sangat terkait dengan versi @azure/functions paket npm. Versi ini di-versi secara independen dari runtime. Baik runtime maupun model pemrograman menggunakan nomor 4 sebagai versi utama terbarunya, tetapi itu kebetulan.
  • Anda tidak dapat mencampur model pemrograman v3 dan v4 di aplikasi fungsi yang sama. Segera setelah Anda mendaftarkan satu fungsi v4 di aplikasi Anda, fungsi v3 apa pun yang terdaftar dalam file function.json diabaikan.

Persyaratan

Versi 4 dari model pemrograman Node.js memerlukan versi minimum berikut:

Sertakan paket npm

Di v4, @azure/functions paket npm berisi kode sumber utama yang mendukung model pemrograman Node.js. Di versi sebelumnya, kode yang dikirim langsung di Azure dan paket npm hanya memiliki jenis TypeScript. Anda sekarang perlu menyertakan paket ini untuk aplikasi TypeScript dan JavaScript. Anda dapat menyertakan paket untuk aplikasi v3 yang ada, tetapi tidak diperlukan.

Tip

Pastikan @azure/functions paket tercantum di bagian dependencies (bukan devDependencies) file package.json Anda. Anda dapat menginstal v4 dengan menggunakan perintah berikut:

npm install @azure/functions

Mengatur titik entri aplikasi Anda

Dalam v4 model pemrograman, Anda dapat menyusun kode sesuka Anda. Satu-satunya file yang Anda butuhkan di akar aplikasi Anda adalah host.json dan package.json.

Jika tidak, Anda menentukan struktur file dengan mengatur main bidang dalam file package.json Anda. Anda dapat mengatur bidang ke main satu file atau beberapa file dengan menggunakan pola glob. Tabel berikut ini memperlihatkan contoh nilai untuk main bidang :

Contoh Deskripsi
src/index.js Mendaftarkan fungsi dari satu file akar.
src/functions/*.js Daftarkan setiap fungsi dari filenya sendiri.
src/{index.js,functions/*.js} Kombinasi tempat Anda mendaftarkan setiap fungsi dari filenya sendiri, tetapi Anda masih memiliki file root untuk kode tingkat aplikasi umum.
Contoh Deskripsi
dist/src/index.js Mendaftarkan fungsi dari satu file akar.
dist/src/functions/*.js Daftarkan setiap fungsi dari filenya sendiri.
dist/src/{index.js,functions/*.js} Kombinasi tempat Anda mendaftarkan setiap fungsi dari filenya sendiri, tetapi Anda masih memiliki file root untuk kode tingkat aplikasi umum.

Tip

Pastikan Anda menentukan main bidang dalam file package.json Anda.

Mengalihkan urutan argumen

Input pemicu, alih-alih konteks pemanggilan, sekarang menjadi argumen pertama untuk handler fungsi Anda. Konteks pemanggilan, sekarang argumen kedua, disederhanakan dalam v4 dan tidak diperlukan sebagai input pemicu. Anda dapat membiarkannya jika Anda tidak menggunakannya.

Tip

Alihkan urutan argumen Anda. Misalnya, jika Anda menggunakan pemicu HTTP, beralihlah (context, request) ke salah satu (request, context) atau hanya (request) jika Anda tidak menggunakan konteks.

Tentukan fungsi Anda dalam kode

Anda tidak lagi harus membuat dan memelihara file konfigurasi function.json terpisah tersebut. Anda sekarang dapat sepenuhnya menentukan fungsi Anda langsung di file TypeScript atau JavaScript Anda. Selain itu, banyak properti sekarang memiliki default sehingga Anda tidak perlu menentukannya setiap saat.

const { app } = require('@azure/functions');

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    handler: async (request, context) => {
        context.log(`Http function processed request for url "${request.url}"`);

        const name = request.query.get('name') || (await request.text()) || 'world';

        return { body: `Hello, ${name}!` };
    },
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || (await request.text()) || 'world';

    return { body: `Hello, ${name}!` };
}

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    handler: httpTrigger1,
});

Tip

Pindahkan konfigurasi dari file function.json Anda ke kode Anda. Jenis pemicu sesuai dengan metode pada app objek dalam model baru. Misalnya, jika Anda menggunakan httpTrigger jenis di function.json, panggil app.http() kode Anda untuk mendaftarkan fungsi. Jika Anda menggunakan timerTrigger, hubungi app.timer().

Meninjau penggunaan konteks Anda

Di v4, objek disederhanakan context untuk mengurangi duplikasi dan membuat pengujian unit penulisan lebih mudah. Misalnya, kami menyederhanakan input dan output utama sehingga hanya diakses sebagai argumen dan nilai pengembalian handler fungsi Anda.

Anda tidak dapat mengakses input dan output utama pada context objek lagi, tetapi Anda masih harus mengakses input dan output sekunder pada context objek. Untuk informasi selengkapnya tentang input dan output sekunder, lihat panduan pengembang Node.js.

Mendapatkan input utama sebagai argumen

Input utama juga disebut pemicu dan merupakan satu-satunya input atau output yang diperlukan. Anda harus memiliki satu pemicu (dan hanya satu).

Versi 4 hanya mendukung satu cara untuk mendapatkan input pemicu, sebagai argumen pertama:

async function httpTrigger1(request, context) {
  const onlyOption = request;
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
  const onlyOption = request;

Tip

Pastikan Anda tidak menggunakan context.req atau context.bindings untuk mendapatkan input.

Atur output utama sebagai nilai pengembalian Anda

Versi 4 hanya mendukung satu cara untuk mengatur output utama, melalui nilai pengembalian:

return { 
  body: `Hello, ${name}!` 
};
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    // ...
    return { 
      body: `Hello, ${name}!` 
    };
}

Tip

Pastikan Anda selalu mengembalikan output di handler fungsi Anda, alih-alih mengaturnya dengan context objek.

Pengelogan konteks

Di v4, metode pengelogan dipindahkan ke objek akar context seperti yang ditunjukkan dalam contoh berikut. Untuk informasi selengkapnya tentang pengelogan , lihat panduan pengembang Node.js.

context.log('This is an info log');
context.error('This is an error');
context.warn('This is an error');

Membuat konteks pengujian

Versi 3 tidak mendukung pembuatan konteks pemanggilan di luar runtime Azure Functions, sehingga pengujian unit penulisan bisa sulit. Versi 4 memungkinkan Anda membuat instans konteks pemanggilan, meskipun informasi selama pengujian tidak terperinci kecuali Anda menambahkannya sendiri.

const testInvocationContext = new InvocationContext({
  functionName: 'testFunctionName',
  invocationId: 'testInvocationId'
});

Tinjau penggunaan jenis HTTP Anda

Jenis permintaan dan respons HTTP sekarang menjadi subset dari standar pengambilan. Mereka tidak lagi unik untuk Azure Functions.

Jenis menggunakan undici paket di Node.js. Paket ini mengikuti standar pengambilan dan saat ini sedang diintegrasikan ke dalam inti Node.js.

HttpRequest

  • Isi. Anda dapat mengakses isi dengan menggunakan metode khusus untuk jenis yang ingin Anda terima:

    const body = await request.text();
    const body = await request.json();
    const body = await request.formData();
    const body = await request.arrayBuffer();
    const body = await request.blob();
    
  • Header:

    const header = request.headers.get('content-type');
    
  • Parameter kueri:

    const name = request.query.get('name');
    

HttpResponse

  • Status:

    return { status: 200 };
    
  • Isi:

    body Gunakan properti untuk mengembalikan sebagian besar jenis seperti string atau Buffer:

    return { body: "Hello, world!" };
    

    jsonBody Gunakan properti untuk cara term mudah untuk mengembalikan respons JSON:

    return { jsonBody: { hello: "world" } };
    
  • Header. Anda dapat mengatur header dengan dua cara, tergantung pada apakah Anda menggunakan HttpResponse kelas atau HttpResponseInit antarmuka:

    const response = new HttpResponse();
    response.headers.set('content-type', 'application/json');
    return response;
    
    return {
      headers: { 'content-type': 'application/json' }
    };
    

Tip

Perbarui logika apa pun dengan menggunakan jenis permintaan atau respons HTTP agar sesuai dengan metode baru.

Tip

Perbarui logika apa pun dengan menggunakan jenis permintaan atau respons HTTP agar sesuai dengan metode baru. Anda harus mendapatkan kesalahan build TypeScript untuk membantu Anda mengidentifikasi apakah Anda menggunakan metode lama.

Pemecahan masalah

Lihat panduan Pemecahan Masalah Node.js.