Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
- O
@azure/functionspacote npm versão 4.3.0 ou posterior. - Funções do Azure runtime versão 4.28 ou posterior.
- Funções do Azure Core Tools versão 4.0.5530 ou posterior, que contém a versão correta em tempo de execução.
Ativar fluxos
Use estes passos para ativar fluxos HTTP na sua aplicação de funções no Azure e nos seus projetos locais:
Se planeias transmitir grandes quantidades de dados, modifica a definição
FUNCTIONS_REQUEST_BODY_SIZE_LIMITno Azure. O tamanho máximo do corpo permitido por predefinição é104857600, o que limita os seus pedidos a cerca de 100 MB.Para o desenvolvimento local, adicione também
FUNCTIONS_REQUEST_BODY_SIZE_LIMITao arquivo local.settings.json.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.