Migreren naar versie 4 van het Node.js programmeermodel voor Azure Functions
In dit artikel worden de verschillen besproken tussen versie 3 en versie 4 van het Node.js programmeermodel en het upgraden van een bestaande v3-app. Als u een nieuwe v4-app wilt maken in plaats van een bestaande v3-app te upgraden, raadpleegt u de zelfstudie voor Visual Studio Code (VS Code) of Azure Functions Core Tools. In dit artikel worden 'tip'-waarschuwingen gebruikt om de belangrijkste concrete acties te markeren die u moet ondernemen om uw app te upgraden.
Versie 4 is ontworpen om Node.js ontwikkelaars de volgende voordelen te bieden:
- Bied een vertrouwde en intuïtieve ervaring aan Node.js ontwikkelaars.
- Maak de bestandsstructuur flexibel met ondersteuning voor volledige aanpassing.
- Schakel over naar een codegerichte benadering voor het definiëren van functieconfiguratie.
Overwegingen
- Het Node.js programmeermodel mag niet worden verward met de Azure Functions-runtime:
- Programmeermodel: Definieert hoe u uw code ontwerpt en specifiek is voor JavaScript en TypeScript.
- Runtime: Definieert het onderliggende gedrag van Azure Functions en wordt gedeeld in alle talen.
- De versie van het programmeermodel is strikt gekoppeld aan de versie van het
@azure/functions
npm-pakket. Deze versie wordt onafhankelijk van de runtime geversied. Zowel de runtime als het programmeermodel gebruiken het nummer 4 als de nieuwste primaire versie, maar dat is toeval. - U kunt de v3- en v4-programmeermodellen niet combineren in dezelfde functie-app. Zodra u één v4-functie in uw app registreert, worden alle v3-functies die zijn geregistreerd in function.json bestanden genegeerd.
Vereisten
Versie 4 van het Node.js programmeermodel vereist de volgende minimale versies:
@azure/functions
npm-pakket v4.0.0- Node.js v18+
- Azure Functions Runtime v4.25+
- Azure Functions Core Tools v4.0.5382+ (indien lokaal uitgevoerd)
@azure/functions
npm-pakket v4.0.0- Node.js v18+
- TypeScript v4+
- Azure Functions Runtime v4.25+
- Azure Functions Core Tools v4.0.5382+ (indien lokaal uitgevoerd)
Het npm-pakket opnemen
In v4 bevat het @azure/functions
npm-pakket de primaire broncode die het Node.js programmeermodel back-ups maakt. In eerdere versies had die code rechtstreeks in Azure verzonden en het npm-pakket alleen de TypeScript-typen. U moet dit pakket nu opnemen voor zowel TypeScript- als JavaScript-apps. U kunt het pakket voor bestaande v3-apps opnemen, maar dit is niet vereist.
Tip
Zorg ervoor dat het @azure/functions
pakket wordt vermeld in de dependencies
sectie (niet devDependencies
) van uw package.json bestand. U kunt v4 installeren met behulp van de volgende opdracht:
npm install @azure/functions
Uw app-invoerpunt instellen
In v4 van het programmeermodel kunt u de code naar wens structuren. De enige bestanden die u nodig hebt in de hoofdmap van uw app, zijn host.json en package.json.
Anders definieert u de bestandsstructuur door het veld in uw main
package.json-bestand in te stellen. U kunt het main
veld instellen op één bestand of meerdere bestanden met behulp van een glob-patroon. In de volgende tabel ziet u voorbeeldwaarden voor het main
veld:
Opmerking | Beschrijving |
---|---|
src/index.js |
Registreer functies uit één hoofdbestand. |
src/functions/*.js |
Registreer elke functie uit een eigen bestand. |
src/{index.js,functions/*.js} |
Een combinatie waarbij u elke functie registreert vanuit een eigen bestand, maar u hebt nog steeds een hoofdbestand voor algemene code op app-niveau. |
Opmerking | Beschrijving |
---|---|
dist/src/index.js |
Registreer functies uit één hoofdbestand. |
dist/src/functions/*.js |
Registreer elke functie uit een eigen bestand. |
dist/src/{index.js,functions/*.js} |
Een combinatie waarbij u elke functie registreert vanuit een eigen bestand, maar u hebt nog steeds een hoofdbestand voor algemene code op app-niveau. |
Tip
Zorg ervoor dat u een main
veld in uw package.json-bestand definieert.
De volgorde van argumenten wijzigen
De triggerinvoer is nu het eerste argument voor de functie-handler in plaats van de aanroepcontext. De aanroepcontext, nu het tweede argument, is vereenvoudigd in v4 en is niet zo vereist als de triggerinvoer. U kunt het uitschakelen als u deze niet gebruikt.
Tip
De volgorde van de argumenten wijzigen. Als u bijvoorbeeld een HTTP-trigger gebruikt, schakelt u over naar (context, request)
of (request, context)
alleen (request)
als u de context niet gebruikt.
Uw functie definiëren in code
U hoeft deze afzonderlijke function.json configuratiebestanden niet meer te maken en te onderhouden. U kunt nu uw functies rechtstreeks definiëren in uw TypeScript- of JavaScript-bestanden. Bovendien hebben veel eigenschappen nu standaardwaarden, zodat u ze niet elke keer hoeft op te geven.
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
Verplaats de configuratie van uw function.json bestand naar uw code. Het type trigger komt overeen met een methode op het app
object in het nieuwe model. Als u bijvoorbeeld een httpTrigger
type in function.json gebruikt, roept app.http()
u de code aan om de functie te registreren. Als u gebruikt timerTrigger
, belt u app.timer()
.
Uw gebruik van context controleren
In v4 is het context
object vereenvoudigd om duplicatie te verminderen en schrijfeenheidtests eenvoudiger te maken. We hebben bijvoorbeeld de primaire invoer en uitvoer gestroomlijnd, zodat ze alleen worden geopend als het argument en de retourwaarde van uw functie-handler.
U hebt geen toegang meer tot de primaire invoer en uitvoer van het context
object, maar u moet nog steeds toegang krijgen tot secundaire invoer en uitvoer op het context
object. Zie de Node.js ontwikkelaarshandleiding voor meer informatie over secundaire invoer en uitvoer.
De primaire invoer als argument ophalen
De primaire invoer wordt ook wel de trigger genoemd en is de enige vereiste invoer of uitvoer. U moet één (en slechts één) trigger hebben.
Versie 4 ondersteunt slechts één manier om de triggerinvoer op te halen, als eerste argument:
async function httpTrigger1(request, context) {
const onlyOption = request;
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
const onlyOption = request;
Tip
Zorg ervoor dat u de invoer niet gebruikt context.req
of context.bindings
wilt ophalen.
De primaire uitvoer instellen als uw retourwaarde
Versie 4 ondersteunt slechts één manier om de primaire uitvoer in te stellen via de retourwaarde:
return {
body: `Hello, ${name}!`
};
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
// ...
return {
body: `Hello, ${name}!`
};
}
Tip
Zorg ervoor dat u altijd de uitvoer in de functie-handler retourneert in plaats van deze in te stellen met het context
object.
Logboekregistratie van context
In v4 zijn logboekregistratiemethoden verplaatst naar het hoofdobject context
, zoals wordt weergegeven in het volgende voorbeeld. Zie de Node.js ontwikkelaarshandleiding voor meer informatie over logboekregistratie.
context.log('This is an info log');
context.error('This is an error');
context.warn('This is an error');
Een testcontext maken
Versie 3 biedt geen ondersteuning voor het maken van een aanroepcontext buiten de Azure Functions-runtime, zodat het ontwerpen van eenheidstests lastig kan zijn. Met versie 4 kunt u een exemplaar van de aanroepcontext maken, hoewel de informatie tijdens tests niet gedetailleerd is, tenzij u deze zelf toevoegt.
const testInvocationContext = new InvocationContext({
functionName: 'testFunctionName',
invocationId: 'testInvocationId'
});
Uw gebruik van HTTP-typen controleren
De HTTP-aanvraag- en antwoordtypen zijn nu een subset van de ophaalstandaard. Ze zijn niet meer uniek voor Azure Functions.
De typen gebruiken het undici
pakket in Node.js. Dit pakket volgt de ophaalstandaard en wordt momenteel geïntegreerd in Node.js kern.
HttpRequest
Hoofdtekst. U kunt de hoofdtekst openen met behulp van een methode die specifiek is voor het type dat u wilt ontvangen:
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');
Queryparameter:
const name = request.query.get('name');
HttpResponse
Status:
return { status: 200 };
Hoofdtekst:
Gebruik de eigenschap om de
body
meeste typen te retourneren, zoals eenstring
ofBuffer
:return { body: "Hello, world!" };
Gebruik de
jsonBody
eigenschap voor de eenvoudigste manier om een JSON-antwoord te retourneren:return { jsonBody: { hello: "world" } };
Koptekst. U kunt de header op twee manieren instellen, afhankelijk van of u de
HttpResponse
klasse of deHttpResponseInit
interface gebruikt:const response = new HttpResponse(); response.headers.set('content-type', 'application/json'); return response;
return { headers: { 'content-type': 'application/json' } };
Tip
Werk alle logica bij met behulp van de HTTP-aanvraag- of antwoordtypen zodat deze overeenkomen met de nieuwe methoden.
Tip
Werk alle logica bij met behulp van de HTTP-aanvraag- of antwoordtypen zodat deze overeenkomen met de nieuwe methoden. U krijgt typeScript-buildfouten om u te helpen identificeren of u oude methoden gebruikt.
Problemen oplossen
Raadpleeg de handleiding voor het oplossen van problemen met Node.js.