Ereignisse
17. März, 21 Uhr - 21. März, 10 Uhr
Nehmen Sie an der Meetup-Serie teil, um skalierbare KI-Lösungen basierend auf realen Anwendungsfällen mit Mitentwicklern und Experten zu erstellen.
Jetzt registrierenDieser Browser wird nicht mehr unterstützt.
Führen Sie ein Upgrade auf Microsoft Edge aus, um die neuesten Funktionen, Sicherheitsupdates und technischen Support zu nutzen.
In diesem Artikel werden die Unterschiede zwischen Version 3 und Version 4 des Node.js-Programmiermodells sowie das Upgrade einer vorhandenen v3-App erläutert. Wenn Sie eine neue v4-App erstellen möchten, anstatt ein Upgrade einer vorhandenen v3-App auszuführen, lesen Sie das Tutorial für Visual Studio Code (VS Code) oder Azure Functions Core Tools. In diesem Artikel werden „Tipp“-Warnungen verwendet, um die wichtigsten konkreten Aktionen, die Sie zum Upgrade Ihrer App ergreifen sollten, hervorzuheben.
Version 4 bietet Node.js-Entwicklern die folgenden Nutzen:
@azure/functions
-npm-Pakets gebunden. Sie wird unabhängig von der Runtime mit Versionsangaben versehen. Sowohl die Runtime als auch das Programmiermodell verwenden die Angabe „4“ als neueste Hauptversion, aber das ist Zufall.Version 4 des Node.js-Programmiermodells erfordert die folgenden Mindestversionen:
@azure/functions
npm-Paket v4.0.0@azure/functions
npm-Paket v4.0.0In V4 enthält das @azure/functions
-npm-Paket den primären Quellcode, der das Node.js-Programmiermodell unterstützt. In früheren Versionen wurde dieser Code direkt in Azure ausgeliefert, und das npm-Paket enthielt nur die TypeScript-Typen. Sie müssen dieses Paket jetzt sowohl für TypeScript- als auch für JavaScript-Apps einschließen. Sie können das Paket für vorhandene v3-Apps einschließen, aber es ist nicht erforderlich.
Tipp
Stellen Sie sicher, dass das @azure/functions
-Paket im dependencies
-Abschnitt (nicht devDependencies
) Ihrer package.json-Datei aufgeführt wird. Sie können V4 mit dem folgenden Befehl installieren:
npm install @azure/functions
In v4 des Programmiermodells können Sie Ihren Code beliebig strukturieren. Die einzigen Dateien, die Sie am Stamm Ihrer App benötigen, sind host.json und package.json.
Andernfalls definieren Sie die Dateistruktur, indem Sie das main
-Feld in Ihrer Datei package.json festlegen. Sie können das main
-Feld auf eine einzelne Datei oder mithilfe eines Globmusters auf mehrere Dateien festlegen. Die folgende Tabelle enthält Beispielwerte für das Feld main
:
Beispiel | BESCHREIBUNG |
---|---|
src/index.js |
Registrieren Sie Funktionen in einer einzelnen Stammdatei. |
src/functions/*.js |
Registrieren Sie jede Funktion in ihrer eigenen Datei. |
src/{index.js,functions/*.js} |
Eine Kombination, in der Sie jede Funktion in ihrer eigenen Datei registrieren, aber dennoch über eine Stammdatei für allgemeinen Code auf App-Ebene verfügen. |
Beispiel | BESCHREIBUNG |
---|---|
dist/src/index.js |
Registrieren Sie Funktionen in einer einzelnen Stammdatei. |
dist/src/functions/*.js |
Registrieren Sie jede Funktion in ihrer eigenen Datei. |
dist/src/{index.js,functions/*.js} |
Eine Kombination, in der Sie jede Funktion in ihrer eigenen Datei registrieren, aber dennoch über eine Stammdatei für allgemeinen Code auf App-Ebene verfügen. |
Tipp
Stellen Sie sicher, dass Sie ein main
-Feld in Ihrer Datei package.json definieren.
Die Triggereingabe ist jetzt das erste Argument für den Funktionshandler anstelle des Aufrufkontexts. Der Aufrufkontext, jetzt das zweite Argument, wurde in V4 vereinfacht und ist nicht so erforderlich wie die Triggereingabe. Er kann weggelassen werden, wenn Sie ihn nicht verwenden.
Tipp
Ändern Sie die Reihenfolge Ihrer Argumente. Wenn Sie beispielsweise einen HTTP-Trigger verwenden, ändern Sie (context, request)
in (request, context)
oder nur (request)
, wenn Sie den Kontext nicht verwenden.
Sie müssen diese separaten funktions.json-Konfigurationsdateien nicht mehr erstellen und verwalten. Sie können Ihre Funktionen jetzt vollständig in Ihren TypeScript- oder JavaScript-Dateien definieren. Darüber hinaus verfügen viele Eigenschaften jetzt über Standardwerte, sodass Sie nicht jedes Mal Werte angeben müssen.
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
Verschieben Sie die Konfiguration aus Ihrer function.json-Datei in Ihren Code. Der Typ des Triggers entspricht einer Methode für das app
-Objekt im neuen Modell. Wenn Sie beispielsweise einen httpTrigger
-Typ in function.json verwenden, rufen Sie app.http()
in Ihrem Code auf, um die Funktion zu registrieren. Wenn Sie timerTrigger
verwenden, rufen Sie app.timer()
auf.
In V4 wird das context
-Objekt vereinfacht, um Dopplungen zu reduzieren und das Schreiben von Komponententests zu vereinfachen. Beispielsweise haben wir die primäre Eingabe und Ausgabe optimiert, sodass auf sie nur als Argument und Rückgabewert Ihres Funktionshandlers zugegriffen wird.
Sie können nicht mehr auf die primäre Eingabe und Ausgabe für das context
-Objekt zugreifen. Sie müssen jedoch weiterhin auf sekundäre Eingaben und Ausgaben für das context
-Objekt zugreifen. Weitere Informationen zu sekundären Eingaben und Ausgaben finden Sie im Entwicklerleitfaden für Node.js.
Die primäre Eingabe wird auch als Trigger bezeichnet und ist die einzige erforderliche Eingabe oder Ausgabe. Sie müssen genau einen Trigger verwenden.
Version 4 unterstützt nur eine Möglichkeit, die Triggereingabe abzurufen, nämlich als erstes Argument:
async function httpTrigger1(request, context) {
const onlyOption = request;
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
const onlyOption = request;
Tipp
Stellen Sie sicher, dass Sie nicht context.req
oder context.bindings
verwenden, um die Eingabe abzurufen.
Version 4 unterstützt nur eine Möglichkeit, die primäre Ausgabe festzulegen, nämlich über den Rückgabewert:
return {
body: `Hello, ${name}!`
};
async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
// ...
return {
body: `Hello, ${name}!`
};
}
Tipp
Stellen Sie sicher, dass Sie die Ausgabe immer im Funktionshandler zurückgeben, anstatt sie mit dem context
-Objekt festzulegen.
In v4 wurden Protokollierungsmethoden in das Stammobjekt context
verschoben, wie im folgenden Beispiel gezeigt. Weitere Informationen zur Protokollierung finden Sie im Leitfaden für die Node.js-Entwicklung.
context.log('This is an info log');
context.error('This is an error');
context.warn('This is an error');
Version 3 unterstützt das Erstellen eines Aufrufkontexts außerhalb der Azure Functions-Runtime nicht, sodass das Erstellen von Komponententests schwierig sein kann. Mit Version 4 können Sie eine Instanz des Aufrufkontexts erstellen, obwohl die Informationen während der Tests nicht detailliert sind, es sei denn, Sie fügen sie selbst hinzu.
const testInvocationContext = new InvocationContext({
functionName: 'testFunctionName',
invocationId: 'testInvocationId'
});
Die HTTP-Anforderungs- und -Antworttypen sind jetzt eine Teilmenge des Abrufstandards. Sie sind nicht mehr typspezifisch für Azure Functions.
Die Typen verwenden das undici
-Paket in Node.js. Das Paket folgt dem Abrufstandard und wird derzeit in Node.js Core integriert.
Text: Sie können auf den Textkörper mit einer Methode zugreifen, die für den gewünschten Typ spezifisch ist:
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');
Abfrageparameter:
const name = request.query.get('name');
Status:
return { status: 200 };
Text:
Verwenden Sie die body
-Eigenschaft, um die meisten Typen wie string
oder Buffer
zurückzugeben:
return { body: "Hello, world!" };
Verwenden Sie die jsonBody
-Eigenschaft als einfachste Möglichkeit, eine JSON-Antwort zurückzugeben:
return { jsonBody: { hello: "world" } };
Header. Sie können den Header auf zwei Arten festlegen, je nachdem, ob Sie die HttpResponse
-Klasse oder die HttpResponseInit
-Schnittstelle verwenden:
const response = new HttpResponse();
response.headers.set('content-type', 'application/json');
return response;
return {
headers: { 'content-type': 'application/json' }
};
Tipp
Aktualisieren Sie die gesamte Programmlogik mithilfe der HTTP-Anforderungs- oder Antworttypen so, dass sie den neuen Methoden entspricht.
Tipp
Aktualisieren Sie die gesamte Programmlogik mithilfe der HTTP-Anforderungs- oder Antworttypen so, dass sie den neuen Methoden entspricht. Sie sollten TypeScript-Buildfehler erhalten, aus denen hervorgeht, ob Sie alte Methoden verwenden.
Weitere Informationen finden Sie im Node.js-Leitfaden zur Problembehandlung.
Ereignisse
17. März, 21 Uhr - 21. März, 10 Uhr
Nehmen Sie an der Meetup-Serie teil, um skalierbare KI-Lösungen basierend auf realen Anwendungsfällen mit Mitentwicklern und Experten zu erstellen.
Jetzt registrierenDokumentation
Node.js Entwicklerreferenz für Azure Functions
Erfahren Sie, wie Sie mithilfe von Node.js Funktionen entwickeln können.
Problembehandlung bei Node.js Apps in Azure Functions
Erfahren Sie, wie Sie häufige Fehler beim Bereitstellen oder Ausführen einer Node.js-App in Azure Functions beheben.
Erfahren Sie, wie Sie serverlose Node.js Anwendungen mit Azure Functions entwickeln. In diesem Leitfaden werden die serverlosen Technologien von Azure vorgestellt, mit denen Sie skalierbare, on-demand-HTTP-Endpunkte mit JavaScript und TypeScript erstellen können.