Migrace na verzi 4 programovacího modelu Node.js pro Azure Functions

Tento článek rozebírá rozdíly mezi verzí 3 a 4 Node.js programovacího modelu a jak upgradovat stávající aplikaci v3. Pokud chcete vytvořit novou aplikaci v4 místo upgradu existující aplikace v3, prohlédni si kurz pro Visual Studio Code (VS Code) nebo Azure Functions Core Tools. Tento článek používá upozornění typu „tip“ ke zdůraznění nejdůležitějších konkrétních kroků, které byste měli podniknout, abyste upgradovali svou aplikaci. Verze 4 je navržená tak, aby vývojářům Node.js poskytovala následující výhody:

  • Poskytněte známé a intuitivní prostředí Node.js vývojářům.
  • Zajištění flexibilní struktury souborů s podporou úplného přizpůsobení
  • Přepnutí na přístup orientovaný na kód pro definování konfigurace funkcí

Důležité informace

  • Programovací model Node.js by neměl být zaměňován s modulem runtime Azure Functions:
    • Programovací model: Definuje způsob vytváření kódu a je specifický pro JavaScript a TypeScript.
    • Modul runtime: Definuje základní chování služby Azure Functions a sdílí se napříč všemi jazyky.
  • Verze programovacího modelu je přísně svázaná s verzí @azure/functions balíčku npm. Je verzován nezávisle na runtime. Modul runtime i programovací model používají číslo 4 jako nejnovější hlavní verzi, ale to je náhoda.
  • Programovací modely v3 a v4 nemůžete kombinovat ve stejné aplikaci funkcí. Jakmile ve své aplikaci zaregistrujete jednu funkci v4, budou všechny funkce v3 zaregistrované v function.json souborech ignorovány.

Požadavky

Verze 4 programovacího modelu Node.js vyžaduje následující minimální verze:

Zahrnutí balíčku npm

Ve verzi 4 obsahuje balíček npm @azure/functions hlavní zdrojový kód, na kterém je založen programovací model Node.js. V předchozích verzích měl tento kód expedovaný přímo v Azure a balíček npm měl pouze typy TypeScript. Teď musíte tento balíček zahrnout pro aplikace TypeScript i JavaScript. Balíček můžete zahrnout pro existující aplikace v3, ale není to nutné.

Tip

Ujistěte se, že @azure/functions je balíček uvedený v oddílu dependencies (ne devDependencies) souboru package.json . Verzi 4 můžete nainstalovat pomocí následujícího příkazu:

npm install @azure/functions

Nastavení vstupního bodu aplikace

V programovacím modelu v4 můžete svůj kód strukturovat jakkoli chcete. Jediné soubory, které potřebujete v kořenovém adresáři aplikace, jsou host.json a package.json.

V opačném případě definujete strukturu souborů nastavením main pole v souboru package.json . Pole main můžete nastavit na jeden nebo více souborů pomocí vzoru glob. Následující tabulka ukazuje ukázkové hodnoty pro main pole:

Příklad Popis
src/index.js Zaregistrujte funkce z jednoho kořenového souboru.
src/functions/*.js Zaregistrujte každou funkci z vlastního souboru.
src/{index.js,functions/*.js} Kombinace, kde každou funkci zaregistrujete z vlastního souboru, ale stále máte kořenový soubor pro obecný kód na úrovni aplikace.
Příklad Popis
dist/src/index.js Zaregistrujte funkce z jednoho kořenového souboru.
dist/src/functions/*.js Zaregistrujte každou funkci z vlastního souboru.
dist/src/{index.js,functions/*.js} Kombinace, kde každou funkci zaregistrujete z vlastního souboru, ale stále máte kořenový soubor pro obecný kód na úrovni aplikace.

Tip

Ujistěte se, že v souboru package.json definujete main pole.

Přepnutí pořadí argumentů

Vstupní parametr triggeru je nyní místo kontextu volání prvním argumentem vaší obslužné funkce. Kontext vyvolání, který je teď druhým argumentem, je ve verzi 4 zjednodušený a není tak povinný jako vstup triggeru. Pokud ho nepoužíváte, můžete ho nechat vypnutý.

Tip

Přepněte pořadí argumentů. Pokud například používáte trigger HTTP, přepněte (context, request) na buď (request, context) nebo jen (request) v případě, že nepoužíváte kontext.

Definování funkce v kódu

Tyto samostatné function.json konfigurační soubory už nemusíte vytvářet a udržovat. Funkce teď můžete plně definovat přímo v souborech TypeScriptu nebo JavaScriptu. Kromě toho má mnoho vlastností výchozí hodnoty, takže je nemusíte zadávat pokaždé.

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

Přesuňte konfiguraci ze souboru function.json do kódu. Typ triggeru odpovídá metodě objektu app v novém modelu. Pokud například v souboru httpTrigger použijete typ , zavolejte ve svém kódu app.http(), aby se funkce zaregistrovala. Pokud používáte timerTrigger, zavolejte app.timer().

Kontrola využití kontextu

Ve verzi 4 je objekt context zjednodušen, aby se snížila duplicita a usnadnilo psaní jednotkových testů. Zjednodušili jsme například primární vstup a výstup, aby se k nim přistupovalo jenom jako k argumentu a návratové hodnotě obslužné rutiny funkce.

Už nemůžete získat přístup k primárnímu vstupu a výstupu objektu context , ale musíte stále přistupovat k sekundárním vstupům a výstupům objektu context . Další informace o sekundárních vstupech a výstupech najdete v příručce pro vývojáře Node.js.

Získejte primární vstup jako argument.

Primární vstup se také nazývá trigger a je jediným požadovaným vstupem nebo výstupem. Musíte mít jeden (a pouze jeden) trigger.

Verze 4 podporuje pouze jeden způsob získání vstupu triggeru jako prvního argumentu:

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

Tip

Ujistěte se, že k získání vstupu nepoužíváte context.req ani context.bindings.

Nastavte primární výstup jako návratovou hodnotu

Verze 4 podporuje pouze jeden způsob nastavení primárního výstupu prostřednictvím návratové hodnoty:

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

Tip

Ujistěte se, že výstup vždy vracíte v obslužné funkci, místo abyste ho nastavovali pomocí objektu context.

Protokolování kontextu

V4 byly metody protokolování přesunuty do kořenového context objektu, jak je znázorněno v následujícím příkladu. Další informace o protokolování najdete v Node.js příručce pro vývojáře.

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

Vytvoření testovacího kontextu

Verze 3 nepodporuje vytvoření kontextu vyvolání mimo modul runtime Azure Functions, takže vytváření testů jednotek může být obtížné. Verze 4 umožňuje vytvořit instanci kontextu vyvolání, i když informace během testů nejsou podrobné, pokud je nepřidáte sami.

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

Kontrola využití typů HTTP

Typy požadavků a odpovědí HTTP jsou nyní podmnožinou standardu Fetch. Už nejsou jedinečné pro Azure Functions.

Typy používají undici balíček v Node.js. Tento balíček se řídí standardem načítání a v současné době se integruje do Node.js jádra.

HttpRequest

  • Tělo. K tělu můžete přistupovat pomocí metody specifické pro typ, který chcete obdržet:

    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();
    
  • Hlavička:

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

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

HttpResponse

  • Stav:

    return { status: 200 };
    
  • Tělo:

    Pomocí vlastnosti body vrátíte většinu typů, například string nebo Buffer:

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

    Použijte vlastnost jsonBody pro nejsnazší způsob, jak vrátit odpověď ve formátu JSON:

    return { jsonBody: { hello: "world" } };
    
  • Záhlaví. Záhlaví můžete nastavit dvěma způsoby podle toho, jestli používáte HttpResponse třídu nebo HttpResponseInit rozhraní:

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

Tip

Aktualizujte libovolnou logiku pomocí požadavku HTTP nebo typů odpovědí tak, aby odpovídaly novým metodám.

Tip

Aktualizujte libovolnou logiku pomocí požadavku HTTP nebo typů odpovědí tak, aby odpovídaly novým metodám. Měly by se vám zobrazit chyby při sestavení v TypeScriptu, které vám pomohou rozpoznat, zda používáte zastaralé metody.

Odstraňování potíží

Přečtěte si průvodce odstraňováním potíží s Node.js.