Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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/functionsbalíč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:
-
@azure/functionsbalíček npm v4.0.0 - Node.js v18+
- Azure Functions Runtime v4.25 a novější
- Azure Functions Core Tools v4.0.5382+ (pokud běží místně)
-
@azure/functionsbalíček npm v4.0.0 - Node.js v18+
- TypeScript v4+
- Azure Functions Runtime v4.25 a novější
- Azure Functions Core Tools v4.0.5382+ (pokud běží místně)
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
bodyvrátíte většinu typů, napříkladstringneboBuffer:return { body: "Hello, world!" };Použijte vlastnost
jsonBodypro 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
HttpResponsetřídu neboHttpResponseInitrozhraní: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.