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)