Corpo de requisição em JSON


Ao trabalhar com API REST, em geral é necessário poder receber requisições com informações no corpo da requisição que geralmente está no formato JSON.

Pelo fato de estar trabalhando com JSON, é necessário ler a stream por completa antes de poder manipular as informações da mesma, pois nesse tipo de formato existem metadados espalhadas em toda a stream, sendo inviável trabalhar de forma parcial.

Então, para isso primeiro é necessário ler toda a stream do corpo da requisição e armazenar em um buffer.

const buffers = []
 
for await (const chunk of request) {
	buffers.push(chunk)
}

Após isso, fazer uma tratativa para converter os dados recebidos no buffer em um formato reconhecido pelo JavaScript, como o formato de objeto. E caso não tenha sido enviado nenhuma informação adicional no corpo da requisição, basta capturar o erro que for lançado ao tentar fazer essa conversão para objeto e então definir o objeto request.body como null.

try {
	request.body = JSON.parse(Buffer.concat(buffers).toString())
} catch {
	request.body = null
}

Por fim, utilizar do recurso de desestruturação no endpoint de “criar usuários” para obter os campos nome e email do corpo da requisição.

if (method === 'POST' && url === '/users') {
	const { name, email } = request.body
 
	users.push({
		id: 1,
		name,
		email,
	})
	return response.writeHead(201).end('Criação de usuário')
}

Exemplo

import http from 'node:http'
 
const users = []
 
const server = http.createServer(async (request, response) => {
    const { method, url } = request
    
    const buffers = []
 
    for await (const chunk of request) {
        buffers.push(chunk)
    }
 
    try {
        request.body = JSON.parse(Buffer.concat(buffers).toString())
    } catch {
        request.body = null
    }
 
    if (method === 'GET' && url === '/users') {
        return response
            .setHeader('Content-type', 'application/json')
            .end(JSON.stringify(users))
    }
 
    if (method === 'POST' && url === '/users') {
        const { name, email } = request.body
 
        users.push({
            id: 1,
            name,
            email,
        })
        return response.writeHead(201).end('Criação de usuário')
    }
 
    return response.writeHead(404).end('Not found')
})
 
server.listen(3000)

Referências