Get HTTP request body data usando Node.js

Aqui temos como você pode extrair dados que foram enviados como JSON no corpo da requisição:

Se você está usando Express, é bem simples: utilize o módulo body-parser.

Por exemplo, para obter o corpo dessa requisição:

const axios = require('axios')
axios.post('https://whatever.com/todos', {
todo: 'Buy the milk'
})

Esse é o código do servidor que vai receber a requisição:

const express = require('express')
const app = express()
app.use(
express.urlencoded({
extended: true
})
)
app.use(express.json())
app.post('/todos', (req, res) => {
console.log(req.body.todo)
})

Se você não está usando Express, e você quer fazer isso em Node.js raiz, terá um pouco mais de trabalho, é claro, pois o Express abstrai muitas coisas pra você.

O ponto chave pra se entender é que quando você inicializa um servidor HTTP usando http.createServer(), a callback é chamada quando o servidor obtêm todos os cabeçalhos HTTP, mas não o body (corpo da requisição).

O objeto request passado na conexão de callback é uma stream.

Então, nós devemos escutar pelo conteúdo do body a ser processado, e ele é processado em chunks(pedaços).

Primeiro nós obtemos os dados escutando os eventos de data da stream, e quando eles finalizam, a stream emite o evento end:

const server = http.createServer((req, res) => {
// nós podemos acessar os cabeçalhos HTTP
req.on('data', chunk => {
console.log(`Data chunk available: ${chunk}`)
})
req.on('end', () => {
// fim dos eventos data
})
})

Então para acessar os dados, assumindo que esperamos receber uma string, nós devemos colocá-los em um array:

const server = http.createServer((req, res) => {
let data = '';
req.on('data', chunk => {
data += chunk;
})
req.on('end', () => {
JSON.parse(data).todo // 'Buy the milk'
})
})