Transmita pedidos HTTP e respostas em Node.js Funções do Azure

Este artigo descreve como transmitir em fluxo pedidos e respostas HTTP na sua aplicação de funções em Node.js. Aprenda a ativar o streaming, processar grandes volumes de dados e lidar com cenários HTTP em tempo real.

Note

Os fluxos HTTP requerem o modelo de programação v4. Se estiveres a usar a v3, vê o guia de migração para atualizar.

Overview

A funcionalidade de streams HTTP facilita o processamento de grandes volumes de dados, o streaming de respostas OpenAI, a entrega de conteúdos dinâmicos e o suporte a outros cenários HTTP essenciais. Ele permite que você transmita solicitações e respostas de pontos de extremidade HTTP em seu aplicativo de função Node.js. Use fluxos HTTP em cenários em que seu aplicativo requer troca e interação em tempo real entre cliente e servidor por HTTP. Você também pode usar fluxos HTTP para obter o melhor desempenho e confiabilidade para seus aplicativos ao usar HTTP.

Pré-requisitos

Ativar fluxos

Use estes passos para ativar fluxos HTTP na sua aplicação de funções no Azure e nos seus projetos locais:

  1. Se planeias transmitir grandes quantidades de dados, modifica a definição FUNCTIONS_REQUEST_BODY_SIZE_LIMIT no Azure. O tamanho máximo do corpo permitido por predefinição é 104857600, o que limita os seus pedidos a cerca de 100 MB.

  2. Para o desenvolvimento local, adicione também FUNCTIONS_REQUEST_BODY_SIZE_LIMIT ao arquivo local.settings.json.

  3. Adicione o seguinte código à sua aplicação em qualquer ficheiro incluído pelo campo principal.

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

app.setup({ enableHttpStream: true });

Sugestão

Use request.body diretamente para tirar o máximo proveito do streaming. Métodos como request.text() armazenam em memória o corpo completo e devolvem uma cadeia de caracteres, o que anula o propósito do streaming.

Exemplos de fluxo

O exemplo seguinte mostra uma função ativada por HTTP que recebe dados através de um pedido HTTP POST. A função transmite estes dados para um ficheiro de saída especificado:

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

O exemplo seguinte mostra uma função ativada por HTTP que transmite o conteúdo de um ficheiro como resposta a pedidos HTTP GET recebidos:

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

Para uma aplicação de exemplo pronta a executar que usa streams, veja este exemplo no GitHub.