Transmite solicitudes HTTP y respuestas en Node.js Azure Functions

Este artículo describe cómo transmitir solicitudes y respuestas HTTP en tu aplicación de Node.js función. Aprende a habilitar el streaming, procesar grandes cantidades de datos y manejar escenarios HTTP en tiempo real.

Note

Los flujos HTTP requieren el modelo de programación v4. Si usas la v3, consulta la guía de migración para actualizar.

Overview

La función de flujos HTTP facilita el procesamiento de grandes cantidades, el streaming de respuestas de OpenAI, la entrega de contenido dinámico y el soporte de otros escenarios clave de HTTP. Permite transmitir solicitudes y respuestas desde puntos de conexión HTTP en la aplicación de funciones de Node.js. Use flujos HTTP en escenarios en los que la aplicación requiera intercambio en tiempo real e interacción entre el cliente y el servidor a través de HTTP. También puede usar secuencias HTTP para obtener el mejor rendimiento y confiabilidad para las aplicaciones cuando se usa HTTP.

Prerequisites

Habilitación de secuencias

Siga estos pasos para habilitar flujos HTTP en la aplicación de funciones en Azure y en los proyectos locales:

  1. Si planea transmitir grandes cantidades de datos, modifique la configuración de FUNCTIONS_REQUEST_BODY_SIZE_LIMIT en Azure. El tamaño máximo permitido por defecto es 104857600, lo que limita tus solicitudes a unos 100 MB.

  2. Para el desarrollo local, agregue también FUNCTIONS_REQUEST_BODY_SIZE_LIMIT al archivo local.settings.json.

  3. Agregue el código siguiente a la aplicación en cualquier archivo incluido en el campo principal.

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

app.setup({ enableHttpStream: true });

Sugerencia

Utiliza request.body directamente para aprovechar al máximo la transmisión en tiempo real. Métodos como request.text() almacenan en búfer todo el cuerpo y devuelven una cadena, lo que anula el propósito del streaming.

Ejemplos de flujos

El siguiente ejemplo muestra una función activada por HTTP que recibe datos a través de una solicitud HTTP POST. La función transmite estos datos a un archivo de salida 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"
      };
    }
  }
});

El siguiente ejemplo muestra una función activada por HTTP que transmite el contenido de un archivo como respuesta a las solicitudes HTTP GET entrantes:

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 una aplicación de ejemplo lista para ejecutar que utiliza flujos, echa un vistazo a este ejemplo en GitHub.