Streamujte HTTP požadavky a odpovědi v Node.js Azure Functions

Tento článek popisuje, jak streamovat HTTP požadavky a odpovědi ve vaší aplikaci Node.js function. Naučte se, jak povolit streamování, zpracovávat velká data a zvládat situace HTTP v reálném čase.

Poznámka:

HTTP streamy vyžadují programovací model v4. Pokud používáte v3, podívejte se na migrační průvodce pro upgrade.

Overview

Funkce HTTP streamů usnadňuje zpracování velkých dat, streamování odpovědí OpenAI, dodávání dynamického obsahu a podporu dalších základních HTTP scénářů. Umožňuje streamovat požadavky a odpovědi z koncových bodů HTTP v rámci vaší funkční aplikace Node.js. Streamy HTTP používejte ve scénářích, kdy vaše aplikace vyžaduje výměnu v reálném čase a interakci mezi klientem a serverem přes PROTOKOL HTTP. Streamy HTTP můžete použít také k zajištění nejlepšího výkonu a spolehlivosti vašich aplikací při používání protokolu HTTP.

Předpoklady

Povolení datových proudů

Pomocí těchto kroků povolíte streamy HTTP ve vaší aplikaci funkcí v Azure a v místních projektech:

  1. Pokud plánujete streamovat velké objemy dat, upravte nastavení FUNCTIONS_REQUEST_BODY_SIZE_LIMIT v Azure. Výchozí maximální povolená velikost těla je 104857600, což omezuje vaše požadavky na přibližně 100 MB.

  2. Pro místní vývoj přidejte FUNCTIONS_REQUEST_BODY_SIZE_LIMIT také do souboru local.settings.json.

  3. Do libovolného souboru, který je součástí hlavního pole, přidejte do aplikace následující kód.

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

app.setup({ enableHttpStream: true });

Tip

Používejte request.body přímo, abyste ze streamování získali co největší užitek. Metody jako request.text() ukládají celou odpověď do vyrovnávací paměti a vracejí řetězec, čímž se míjí účinkem streamování.

Příklady streamů

Následující příklad ukazuje funkci spuštěnou HTTP, která přijímá data prostřednictvím HTTP POST požadavku. Funkce tato data streamuje do specifikovaného výstupního souboru:

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

Následující příklad ukazuje funkci spuštěnou HTTP, která streamuje obsah souboru jako odpověď na příchozí HTTP GET požadavky:

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

Pro připravenou ukázkovou aplikaci využívající streamy se podívejte na tento příklad na GitHub.