Umsteigen von „Express.js“ auf Azure Functions

„Express.js“ gehört zu den beliebtesten Node.js-Frameworks für Webentwickler und bleibt weiterhin eine hervorragende Wahl zum Entwickeln von Apps, die API-Endpunkte bereitstellen.

Wenn Sie Code zu einer serverlosen Architektur migrieren, wirkt sich das Refactoring von Express.js-Endpunkten auf die folgenden Bereiche aus:

  • Middleware: „Express.js“ bietet eine robuste Sammlung von Middleware. Viele Middlewaremodule sind nicht mehr für Azure Functions und Funktionen von Azure API Management erforderlich. Stellen Sie vor der Migration von Endpunkten sicher, dass Sie die gesamte Logik, die von wichtiger Middleware verarbeitet wird, replizieren oder ersetzen können.

  • Abweichende APIs: Die API, die zur Verarbeitung von Anforderungen und Antworten verwendet wird, unterscheidet sich zwischen Azure Functions und „Express.js“. Im folgenden Beispiel werden die erforderlichen Änderungen erläutert.

  • Standardroute: Standardmäßig werden Azure Functions-Endpunkte unter der api-Route bereitgestellt. Routingregeln können über routePrefix in der Datei host.json konfiguriert werden.

  • Konfiguration und Konventionen: Eine Functions-App verwendet die Datei function.json, um HTTP-Verben sowie Sicherheitsrichtlinien zu definieren und kann die Eingabe und Ausgabe der Funktion konfigurieren. Standardmäßig definiert der Ordnername, der die Funktionsdateien enthält, den Endpunktnamen, aber Sie können den Namen über die Eigenschaft route in der Datei function.json ändern.

Tipp

Weitere Informationen finden Sie im interaktiven Tutorial Refactoring von „Node.js“ und Express-APIs in serverlose APIs mit Azure Functions.

Beispiel

Express.js

Das folgende Beispiel zeigt einen typischen GET-Endpunkt von „Express.js“.

// server.js
app.get('/hello', (req, res) => {
  try {
    res.send("Success!");
  } catch(error) {
    const err = JSON.stringify(error);
    res.status(500).send(`Request error. ${err}`);
  }
});

Wenn eine GET-Anforderung an /hello gesendet wird, wird eine HTTP 200-Antwort zurückgegeben, die Success enthält. Wenn für den Endpunkt ein Fehler auftritt, ist die Antwort HTTP 500 mit den Fehlerdetails.

Azure Functions

Azure Functions organisiert Konfigurations- und Codedateien in einem einzelnen Ordner für jede Funktion. Standardmäßig gibt der Name des Ordners den Funktionsnamen vor.

Beispielsweise verfügt eine Funktion mit dem Namen hello über einen Ordner mit den folgenden Dateien.

| - hello
|  - function.json
|  - index.js

Im folgenden Beispiel wird das gleiche Ergebnis wie der Express.js-Endpunkt oben implementiert, jedoch mit Azure Functions.

// hello/index.js
module.exports = async function (context, req) {
  try {
    context.res = { body: "Success!" };
  } catch(error) {
    const err = JSON.stringify(error);
    context.res = {
      status: 500,
      body: `Request error. ${err}`
    };
  }
};

Bei der Umstellung auf Functions werden die folgenden Änderungen vorgenommen:

  • Modul: Der Funktionscode wird als JavaScript-Modul implementiert.

  • Kontext und Antwortobjekt: context ermöglicht Ihnen die Kommunikation mit der Laufzeit der Funktion. Aus dem Kontext können Sie Anforderungsdaten lesen und die Antwort der Funktion festlegen. Synchroner Code erfordert, dass Sie 1.x context.done() zum Abschluss der Ausführung aufrufen, während 2.x async-Funktionen oder höher die Anforderung implizit auflösen.

  • Benennungskonvention: Der Ordnername, der zur Speicherung der Azure Functions-Dateien verwendet wird, wird standardmäßig als Endpunktname verwendet (dies kann in der Datei function.json überschrieben werden).

  • Konfiguration: Sie definieren die HTTP-Verben in der Datei function.json, z. B. mit POST oder PUT.

Die folgende Datei function.json enthält Konfigurationsinformationen für die Funktion.

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": ["get"]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ]
}

Wenn Sie get im methods-Array definieren, steht die Funktion für HTTP-GET-Anforderungen zur Verfügung. Wenn Ihre API POST-Supportanforderungen akzeptieren soll, können Sie dem Array auch post hinzufügen.

Nächste Schritte