Strömma HTTP-förfrågningar och svar i Node.js Azure Functions

Den här artikeln beskriver hur man strömmar HTTP-förfrågningar och svar i din Node.js funktionsapp. Lär dig hur du aktiverar streaming, bearbetar stora data och hanterar realtidsscenarier med HTTP.

Anmärkning

HTTP-strömmar kräver v4-programmeringsmodellen. Om du använder v3, se migreringsguiden för uppgradering.

Overview

HTTP-strömmar-funktionen gör det enklare att bearbeta stora data, strömma OpenAI-svar, leverera dynamiskt innehåll och stödja andra kärn-HTTP-scenarier. Du kan strömma begäranden till och svar från HTTP-slutpunkter i din Node.js funktionsapp. Använd HTTP-strömmar i scenarier där din app kräver utbyte i realtid och interaktion mellan klient och server via HTTP. Du kan också använda HTTP-strömmar för att få bästa prestanda och tillförlitlighet för dina appar när du använder HTTP.

Förutsättningar

Aktivera strömmar

Använd de här stegen för att aktivera HTTP-strömmar i funktionsappen i Azure och i dina lokala projekt:

  1. Om du planerar att strömma stora mängder data ändrar du inställningen FUNCTIONS_REQUEST_BODY_SIZE_LIMIT i Azure. Den högsta tillåtna storleken för brödtexten som standard är 104857600, vilket begränsar dina begäranden till en storlek på cirka 100 MB.

  2. För lokal utveckling lägger du även till FUNCTIONS_REQUEST_BODY_SIZE_LIMIT i filen local.settings.json.

  3. Lägg till följande kod i din app i alla filer som ingår i huvudfältet.

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

app.setup({ enableHttpStream: true });

Tip

Använd request.body direkt för att få mest ut av streaming. Metoder som request.text() buffrar hela meddelandetexten och returnerar en sträng, vilket omintetgör syftet med strömning.

Streamexempel

Följande exempel visar en HTTP-triggad funktion som tar emot data via en HTTP POST-förfrågan. Funktionen strömmar denna data till en specificerad utdatafil:

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

Följande exempel visar en HTTP-triggad funktion som strömmar en fils innehåll som svar på inkommande HTTP GET-förfrågningar:

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

För en färdig exempelapp som använder strömmar, kolla in detta exempel på GitHub.