Obtendo Dados do Cliente - Node.js
Todos os dados da solicitação são passados através do objeto request
http.createServer()
http.createServer()
request
Neste caso, podemos usar diferentes métodos para obter os dados.
Processando os Eventos data e end do Objeto request
O primeiro método consiste em escutar o evento data
end
const http = require("http");
const fs = require("fs");
http.createServer((request, response) => {
if (request.url === "/user") {
let data = "";
request.on("data", chunk => {
data += chunk;
});
request.on("end", () => {
console.log(data);
response.end("Dados recebidos com sucesso");
});
} else {
fs.readFile("index.html", (error, data) => response.end(data));
}
}).listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Ao acessar o endereço /user
request.on
data
chunk
texto
variável
data
Quando todos os dados são recebidos, o evento end
Para testar, podemos definir o seguinte cliente na página index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<script>
sendUser();
async function sendUser() {
const response = await fetch("/user", { method: "POST", body: "Tom Smith" });
const responseText = await response.text();
console.log(responseText);
}
</script>
</body>
</html>
Aqui, o cliente envia uma string ao servidor, que, após recebê-la, a exibirá no console:
C:\app>node server.js Servidor iniciado em http://localhost:3000 Tom Smith
Iterando Sobre o Iterador Assíncrono do request
O segundo método envolve iterar sobre o objeto request
const http = require("http");
const fs = require("fs");
http.createServer(async (request, response) => {
if (request.url === "/user") {
const buffers = []; // buffer para os dados recebidos
for await (const chunk of request) {
buffers.push(chunk); // adicionando todos os dados recebidos ao buffer
}
const data = Buffer.concat(buffers).toString();
console.log(data);
response.end("Dados recebidos com sucesso");
} else {
fs.readFile("index.html", (error, data) => response.end(data));
}
}).listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Aqui, primeiramente definimos um buffer para os dados recebidos:
const buffers = [];
Depois, iteramos sobre o objeto request
buffers
for await (const chunk of request) {
buffers.push(chunk);
}
No final, usamos a função Buffer.concat()
toString()
const data = Buffer.concat(buffers).toString();
Dessa forma, não estamos limitados a receber apenas dados textuais. Por exemplo, podemos receber dados no formato JSON:
const http = require("http");
const fs = require("fs");
http.createServer(async (request, response) => {
if (request.url === "/user") {
const buffers = []; // buffer para os dados recebidos
for await (const chunk of request) {
buffers.push(chunk); // adicionando todos os dados recebidos ao buffer
}
const user = JSON.parse(Buffer.concat(buffers).toString());
console.log(user.name, "-", user.age);
response.end("Dados recebidos com sucesso");
} else {
fs.readFile("index.html", (error, data) => response.end(data));
}
}).listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Aqui, supomos que o cliente está enviando um objeto JSON ao servidor, contendo as propriedades name
age
JSON.parse()
O código do cliente para teste poderia ser assim:
sendUser();
async function sendUser() {
const response = await fetch("/user", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: "Tom",
age: 37
})
});
const responseText = await response.text();
console.log(responseText);
}
Neste caso, a saída do console será semelhante a:
C:\app>node server.js Servidor iniciado em http://localhost:3000 Tom - 37