Node.js Azure İşlevleri’da HTTP istek ve yanıtlarının akışını gerçekleştirme

Bu makale, Node.js fonksiyon uygulamanızda HTTP istekleri ve yanıtlarını nasıl yayınlayacağınızı açıklar. Akışı nasıl etkinleştireceğini, büyük verileri nasıl işleyeceğinizi ve gerçek zamanlı HTTP senaryolarını nasıl yöneteceğinizi öğrenin.

Note

HTTP akışları için v4 programlama modeli gereklidir. V3 kullanıyorsan, yükseltme için göç rehberine bak.

Overview

HTTP akışları özelliği, büyük verileri işlemeyi, OpenAI yanıtlarını akışını, dinamik içerik sunmayı ve diğer temel HTTP senaryolarını desteklemeyi kolaylaştırır. Node.js işlev uygulamanızdaki HTTP uç noktalarına istekleri ve yanıtları akışla göndermenizi sağlar. Uygulamanızın http üzerinden istemci ve sunucu arasında gerçek zamanlı değişim ve etkileşim gerektirdiği senaryolarda HTTP akışlarını kullanın. HTTP kullanırken uygulamalarınız için en iyi performansı ve güvenilirliği elde etmek için HTTP akışlarını da kullanabilirsiniz.

Prerequisites

Akışları etkinleştirme

Azure'daki işlev uygulamanızda ve yerel projelerinizde HTTP akışlarını etkinleştirmek için şu adımları kullanın:

  1. Büyük miktarlarda veri akışı yapmayı planlıyorsanız, Azure'da FUNCTIONS_REQUEST_BODY_SIZE_LIMIT ayarını değiştirin. Varsayılan maksimum gövde boyutu 104857600, bu da taleplerinizi yaklaşık 100 MB ile sınırlar.

  2. Yerel geliştirme için FUNCTIONS_REQUEST_BODY_SIZE_LIMIT ögesini de local.settings.json dosyasına ekleyin.

  3. Ana alanınıza dahil edilen herhangi bir dosyaya aşağıdaki kodu uygulamanıza ekleyin.

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

app.setup({ enableHttpStream: true });

Tip

Yayından en iyi faydayı almak için doğrudan kullanın request.body . request.text() gibi yöntemler, tüm gövdeyi tamponlayıp bir dize döndürür; bu da veri akışının amacını boşa çıkarır.

Akış örnekleri

Aşağıdaki örnek, HTTP POST talebi aracılığıyla veri alan HTTP tetikleyici bir fonksiyonu göstermektedir. Fonksiyon, bu veriyi belirli bir çıktı dosyasına aktarır:

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

Aşağıdaki örnek, gelen HTTP GET taleplerine yanıt olarak dosyanın içeriğini akış olarak aktaran HTTP tetiklenen bir fonksiyonu göstermektedir:

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

Akış kullanan hazır bir örnek uygulama için GitHub'daki bu örneğe göz atın.