Strumieniowanie żądań HTTP i odpowiedzi w Node.js Azure Functions

Ten artykuł opisuje, jak przesyłać żądania i odpowiedzi HTTP w aplikacji Node.js function. Dowiedz się, jak włączyć streaming, przetwarzać duże ilości danych oraz obsługiwać scenariusze HTTP w czasie rzeczywistym.

Note

Strumienie HTTP wymagają modelu programowania v4. Jeśli używasz v3, zobacz przewodnik migracji do aktualizacji.

Overview

Funkcja HTTP streams ułatwia przetwarzanie dużych danych, przesyłanie odpowiedzi OpenAI, dostarczanie dynamicznych treści oraz wspieranie innych podstawowych scenariuszy HTTP. Umożliwia strumieniowe przesyłanie żądań do punktów końcowych HTTP i odbieranie odpowiedzi z tych punktów w aplikacji funkcji Node.js. Używaj strumieni HTTP w scenariuszach, w których aplikacja wymaga wymiany w czasie rzeczywistym i interakcji między klientem a serwerem za pośrednictwem protokołu HTTP. Możesz również użyć strumieni HTTP, aby uzyskać najlepszą wydajność i niezawodność aplikacji podczas korzystania z protokołu HTTP.

Wymagania wstępne

Włącz strumienie

Wykonaj następujące kroki, aby włączyć strumienie HTTP w aplikacji funkcji w Azure i w projektach lokalnych:

  1. Jeśli planujesz przesyłanie strumieniowe dużych ilości danych, zmodyfikuj ustawienie FUNCTIONS_REQUEST_BODY_SIZE_LIMIT w Azure. Domyślny maksymalny dozwolony rozmiar treści to 104857600, co ogranicza rozmiar twoich żądań do około 100 MB.

  2. W przypadku tworzenia lokalnego dodaj również FUNCTIONS_REQUEST_BODY_SIZE_LIMIT do pliku local.settings.json.

  3. Dodaj następujący kod do swojej aplikacji w dowolnym pliku dołączonym przez twoje pole główne.

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

app.setup({ enableHttpStream: true });

Wskazówka

Używaj request.body bezpośrednio, aby jak najwięcej korzystać ze streamingu. Metody takie jak request.text() buforują całą treść i zwracają ciąg znaków, co niweczy sens przetwarzania strumieniowego.

Przykłady strumieni

Poniższy przykład pokazuje funkcję wyzwalaną przez HTTP, która odbiera dane za pośrednictwem żądania HTTP POST. Funkcja przesyła te dane strumieniowo do określonego pliku wyjściowego:

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"
      };
    }
  }
});

Poniższy przykład pokazuje funkcję wyzwalaną przez HTTP, która przesyła zawartość pliku jako odpowiedź na nadchodzące żądania HTTP GET:

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"
      };
    }
  }
});

Aby zobaczyć gotową do uruchomienia przykładową aplikację korzystającą ze strumieni, sprawdź ten przykład na GitHub.