Transmita requisições HTTP e respostas em Node.js Azure Functions

Este artigo descreve como processar em fluxo solicitações e respostas HTTP no seu aplicativo de funções do Node.js. Aprenda a habilitar streaming, processar grandes volumes de dados e lidar com cenários HTTP em tempo real.

Note

Streams HTTP exigem o modelo de programação v4. Se você está usando a v3, veja o guia de migração para atualizar.

Overview

O recurso de streams HTTP facilita o processamento de grandes volumes de dados, o streaming de respostas OpenAI, a entrega de conteúdo dinâmico e o suporte a outros cenários principais do HTTP. Permite transmitir solicitações e respostas de pontos de extremidade HTTP no seu aplicativo de funções Node.js. Use fluxos HTTP nos cenários em que seu aplicativo requer intercâmbio e interação entre cliente e servidor por HTTP em tempo real. Você também pode usar fluxos HTTP para obter o melhor desempenho e confiabilidade para seus aplicativos quando usar HTTP.

Pré-requisitos

Habilitar fluxos

Use estas etapas para habilitar fluxos HTTP em seu aplicativo de funções em Azure e em seus projetos locais:

  1. Se você planeja transmitir grandes quantidades de dados, modifique a configuração FUNCTIONS_REQUEST_BODY_SIZE_LIMIT em Azure. O tamanho máximo padrão permitido é 104857600, o que limita suas solicitações a um tamanho de 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 código a seguir ao seu aplicativo em qualquer arquivo incluído por seu campo principal.

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

app.setup({ enableHttpStream: true });

Dica

Use request.body diretamente para obter o máximo benefício do streaming. Métodos como request.text() armazenam em buffer o corpo inteiro e retornam uma cadeia de caracteres, o que anula o propósito do streaming.

Exemplos de fluxos

O exemplo a seguir mostra uma função ativada por HTTP que recebe dados por meio de uma requisição HTTP POST. A função transmite esses dados para um arquivo 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 a seguir mostra uma função HTTP acionada que transmite o conteúdo de um arquivo como resposta a solicitações HTTP GET recebidas:

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 um aplicativo de exemplo pronto para rodar que usa streams, confira este exemplo no GitHub.