Migrálás az Azure Functions Node.js programozási modelljének 4-es verziójára

Ez a cikk a Node.js programozási modell 3. és 4. verziója közötti különbségeket, valamint a meglévő v3-alkalmazások frissítésének módját ismerteti. Ha egy meglévő v3-alkalmazás frissítése helyett új v4-alkalmazást szeretne létrehozni, tekintse meg a Visual Studio Code (VS Code) vagy az Azure Functions Core Tools oktatóanyagát. Ez a cikk "tipp" riasztásokkal emeli ki az alkalmazás frissítése során végrehajtandó legfontosabb konkrét műveleteket.

A 4-es verzió a Node.js fejlesztői számára a következő előnyöket biztosítja:

  • Ismerős és intuitív élményt nyújt a Node.js fejlesztőinek.
  • A fájlstruktúra rugalmassá tétele a teljes testreszabás támogatásával.
  • Váltson kódközpontú megközelítésre a függvénykonfiguráció definiálásához.

Megfontolások

  • A Node.js programozási modellt nem szabad összekeverni az Azure Functions-futtatókörnyezettel:
    • Programozási modell: Meghatározza a kód készítésének módját, és a JavaScriptre és a TypeScriptre jellemző.
    • Futtatókörnyezet: Meghatározza az Azure Functions mögöttes viselkedését, és minden nyelven meg van osztva.
  • A programozási modell verziója szigorúan az npm-csomag verziójához @azure/functions van kötve. A futtatókörnyezettől függetlenül verziószámozott. A futtatókörnyezet és a programozási modell is a 4-es számot használja a legújabb főverzióként, de ez véletlen.
  • A v3- és v4-programozási modellek nem keverhetők ugyanabban a függvényalkalmazásban. Amint regisztrál egy v4-függvényt az alkalmazásban, a függvény.json fájlokban regisztrált v3-függvények figyelmen kívül lesznek hagyva.

Követelmények

A Node.js programozási modell 4. verziójához a következő minimális verziók szükségesek:

Az npm-csomag belefoglalása

A v4-ben az @azure/functions npm-csomag tartalmazza a Node.js programozási modellt alátámasztó elsődleges forráskódot. A korábbi verziókban a közvetlenül az Azure-ban szállított kód és az npm-csomag csak TypeScript-típusok voltak. Ezt a csomagot mostantól TypeScript- és JavaScript-alkalmazásokhoz is tartalmaznia kell. A csomagot meglévő v3-alkalmazásokhoz is felveheti, de nem szükséges.

Tipp.

Győződjön meg arról, hogy a @azure/functions csomag szerepel a dependencies package.json fájl (nem devDependencies) szakaszában. A v4-et a következő paranccsal telepítheti:

npm install @azure/functions

Az alkalmazás belépési pontának beállítása

A programozási modell v4-ben tetszés szerint strukturálhatja a kódot. Az alkalmazás gyökerében csak a host.json és a package.json fájlra van szüksége.

Ellenkező esetben a package.json fájl mezőjének beállításával definiálhatja a main fájlstruktúrát. A mezőt egy gömbmintával egyetlen fájlra vagy több fájlra állíthatja main be. Az alábbi táblázat a mezőhöz tartozó main példaértékeket mutatja be:

Példa Leírás
src/index.js Függvények regisztrálása egyetlen gyökérfájlból.
src/functions/*.js Regisztrálja az egyes függvényeket a saját fájljából.
src/{index.js,functions/*.js} Olyan kombináció, amelyben az egyes függvényeket a saját fájljából regisztrálja, de az általános alkalmazásszintű kódhoz továbbra is rendelkezik gyökérfájllal.
Példa Leírás
dist/src/index.js Függvények regisztrálása egyetlen gyökérfájlból.
dist/src/functions/*.js Regisztrálja az egyes függvényeket a saját fájljából.
dist/src/{index.js,functions/*.js} Olyan kombináció, amelyben az egyes függvényeket a saját fájljából regisztrálja, de az általános alkalmazásszintű kódhoz továbbra is rendelkezik gyökérfájllal.

Tipp.

Ügyeljen arra, hogy a package.json fájlban adjon meg egy main mezőt.

Az argumentumok sorrendjének váltása

Az eseményindító bemenete a meghívási környezet helyett most a függvénykezelő első argumentuma. A meghívási környezet, amely most a második argumentum, a v4-ben egyszerűsítve van, és nem olyan szükséges, mint az eseményindító bemenete. Ha nem használja, kikapcsolhatja.

Tipp.

Váltsa át az argumentumok sorrendjét. Ha például HTTP-eseményindítót használ, váltson (context, request) vagy (request, context) csak (request) akkor, ha nem használja a környezetet.

Függvény definiálása kódban

Ezeket a különálló function.json konfigurációs fájlokat már nem kell létrehoznia és karbantartania. Mostantól teljes mértékben definiálhatja a függvényeket közvetlenül a TypeScript- vagy JavaScript-fájlokban. Emellett számos tulajdonságnak van alapértelmezett értéke, így nem kell minden alkalommal megadnia őket.

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,
});

Tipp.

Helyezze át a konfigurációt a function.json fájlból a kódba. Az eseményindító típusa megfelel az új modell objektumának app egy metódusának. Ha például a function.json típust httpTrigger használja, hívja meg app.http() a kódban a függvény regisztrálását. Ha használja timerTrigger, hívja meg a következőt app.timer():

A környezet használatának áttekintése

A v4-ben az objektum egyszerűbbé teszi a context duplikációt, és egyszerűbbé teszi az egységtesztek írását. Leegyszerűsítettük például az elsődleges bemenetet és kimenetet, hogy csak a függvénykezelő argumentumaként és visszatérési értékeként legyenek elérhetők.

Az objektum elsődleges bemenete és kimenete context már nem érhető el, de továbbra is hozzá kell férnie az context objektum másodlagos bemeneteihez és kimeneteihez. A másodlagos bemenetekről és kimenetekről további információt a Node.js fejlesztői útmutatójában talál.

Az elsődleges bemenet lekérése argumentumként

Az elsődleges bemenetet eseményindítónak is nevezik, és ez az egyetlen szükséges bemenet vagy kimenet. Egy (és csak egy) eseményindítóval kell rendelkeznie.

A 4-es verzió csak egyféleképpen támogatja az eseményindító bemenetének lekérését az első argumentumként:

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

Tipp.

Győződjön meg arról, hogy nem használja context.req a bemenetet, vagy context.bindings nem szeretné lekérni a bemenetet.

Az elsődleges kimenet beállítása visszatérési értékként

A 4-es verzió csak egy módon támogatja az elsődleges kimenet beállítását a visszatérési értéken keresztül:

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

Tipp.

Győződjön meg arról, hogy mindig a függvénykezelőben adja vissza a kimenetet, ahelyett, hogy az context objektummal állítja be.

Környezet naplózása

A v4-ben a naplózási metódusok át lettek helyezve a gyökérobjektumba context az alábbi példában látható módon. A naplózással kapcsolatos további információkért tekintse meg a Node.js fejlesztői útmutatót.

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

Tesztkörnyezet létrehozása

A 3. verzió nem támogatja a meghívási környezet létrehozását az Azure Functions-futtatókörnyezeten kívül, így az egységtesztek készítése nehézkes lehet. A 4-es verzió lehetővé teszi a meghívási környezet egy példányának létrehozását, bár a tesztek során lévő információk csak akkor lesznek részletesek, ha ön adja hozzá.

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

HTTP-típusok használatának áttekintése

A HTTP-kérés- és választípusok mostantól a beolvasási szabvány részhalmazai. Már nem egyediek az Azure Functionsben.

A típusok a Node.js-ben használják a undici csomagot. Ez a csomag a beolvasási szabványt követi, és jelenleg a Node.js Core-ba van integrálva .

HttpRequest

  • Test. A törzset a kapni kívánt típusnak megfelelő metódussal érheti el:

    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();
    
  • Fejléc:

    const header = request.headers.get('content-type');
    
  • Lekérdezési paraméter:

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

HttpResponse

  • Állapot:

    return { status: 200 };
    
  • Törzs:

    A tulajdonság használatával adja vissza a body legtöbb típust, például a string vagy Buffer:

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

    jsonBody A JSON-válasz visszaadásának legegyszerűbb módja a tulajdonság használata:

    return { jsonBody: { hello: "world" } };
    
  • Fejléc. A fejléc kétféleképpen állítható be attól függően, hogy az osztályt vagy a HttpResponseHttpResponseInit felületet használja-e:

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

Tipp.

Frissítse a logikát a HTTP-kérések vagy választípusok használatával, hogy megfeleljenek az új módszereknek.

Tipp.

Frissítse a logikát a HTTP-kérések vagy választípusok használatával, hogy megfeleljenek az új módszereknek. TypeScript buildelési hibákat kell kapnia, amelyek segítenek azonosítani, hogy régi metódusokat használ-e.

Hibaelhárítás

Tekintse meg a Node.js hibaelhárítási útmutatót.