Stream HTTP-verzoeken en -reacties in Node.js Azure Functions

Dit artikel beschrijft hoe je HTTP-verzoeken en -antwoorden streamt in je Node.js functie-app. Leer hoe je streaming inschakelt, grote data verwerkt en realtime HTTP-scenario's afhandelt.

Note

HTTP-streams vereisen het programmeermodel v4. Als je v3 gebruikt, bekijk dan de migratiegids om te upgraden.

Overview

De HTTP-streams-functie maakt het eenvoudiger om grote data te verwerken, OpenAI-antwoorden te streamen, dynamische content te leveren en andere kern-HTTP-scenario's te ondersteunen. Hiermee kunt u aanvragen naar en antwoorden van HTTP-eindpunten streamen in uw Node.js functie-app. Gebruik HTTP-streams in scenario's waarin uw app realtime uitwisseling en interactie tussen client en server via HTTP vereist. U kunt ook HTTP-streams gebruiken om de beste prestaties en betrouwbaarheid voor uw apps te verkrijgen wanneer u HTTP gebruikt.

Prerequisites

Streams inschakelen

Gebruik deze stappen om HTTP-streams in te schakelen in uw functie-app in Azure en in uw lokale projecten:

  1. Als u van plan bent grote hoeveelheden gegevens te streamen, wijzigt u de instelling FUNCTIONS_REQUEST_BODY_SIZE_LIMIT in Azure. De standaard toegestane maximale grootte van de requestbody is 104857600, wat uw verzoeken beperkt tot ongeveer 100 MB.

  2. Voor lokale ontwikkeling voegt u ook toe FUNCTIONS_REQUEST_BODY_SIZE_LIMIT aan het local.settings.json-bestand.

  3. Voeg de volgende code toe aan uw app in elk bestand dat is opgenomen in het hoofdveld.

const { app } = require("@azure/functions");

app.setup({ enableHttpStream: true });

Tip

Gebruik request.body direct om het meeste voordeel uit streaming te halen. Methoden zoals request.text() bufferen de volledige inhoud en geven een string terug, wat het doel van streaming tenietdoet.

Stream-voorbeelden

Het volgende voorbeeld toont een HTTP-getriggerde functie die gegevens ontvangt via een HTTP POST-verzoek. De functie streamt deze gegevens naar een gespecificeerd uitvoerbestand:

const { app } = require("@azure/functions");
const fs = require("fs");
const path = require("path");

app.http("httpTriggerStreamRequest", {
  methods: ["POST"],
  handler: async (request, context) => {
    context.log("HTTP trigger function processed a request.");

    if (!request.body) {
      return {
        status: 400,
        body: "Request body is required"
      };
    }

    // Create a writable stream to a file
    const outputPath = path.join(__dirname, "streamed-output.txt");
    const writeStream = fs.createWriteStream(outputPath);

    try {
      // Stream the request body to the file
      const reader = request.body.getReader();
      let done = false;

      while (!done) {
        const { value, done: readerDone } = await reader.read();
        done = readerDone;
        
        if (value) {
          writeStream.write(value);
        }
      }

      writeStream.end();
      
      return {
        status: 200,
        body: "Data successfully streamed to file"
      };
    } catch (error) {
      context.log.error("Error streaming data:", error);
      return {
        status: 500,
        body: "Error processing stream"
      };
    }
  }
});

Het volgende voorbeeld toont een HTTP-getriggerde functie die de inhoud van een bestand streamt als antwoord op binnenkomende HTTP GET-verzoeken:

const { app } = require("@azure/functions");
const fs = require("fs");
const path = require("path");

app.http("httpTriggerStreamResponse", {
  methods: ["GET"],
  handler: async (request, context) => {
    context.log("HTTP trigger function processed a request.");

    const filePath = path.join(__dirname, "sample-data.txt");

    try {
      // Check if file exists
      if (!fs.existsSync(filePath)) {
        return {
          status: 404,
          body: "File not found"
        };
      }

      // Create a readable stream from the file
      const readStream = fs.createReadStream(filePath);
      
      return {
        status: 200,
        headers: {
          "Content-Type": "text/plain",
          "Transfer-Encoding": "chunked"
        },
        body: readStream
      };
    } catch (error) {
      context.log.error("Error streaming file:", error);
      return {
        status: 500,
        body: "Error streaming file"
      };
    }
  }
});

Voor een kant-en-klare voorbeeldapp die streams gebruikt, bekijk dit voorbeeld op GitHub.