Body Parser
@lottojs/body-parser
é um de nossos built-in middlewares que permite analisar o corpo da solicitação http a partir de solicitações POST
, PUT
e PATCH
.
Content-Types Suportados
Já oferecemos suporte aos Content-Types
mais comuns:
- Multipart Form (multipart/form-data).
- Form URL Encoded (application/x-www-form-urlencoded).
- JSON (application/json).
- Text (text/plain).
Multipart Form
Falando sobre requests multipart/form-data
, se você estiver apenas enviando campos de texto, seus dados vão para o objeto req.body
mas se houver também algum arquivo além de req.body
você também terá dados no objeto req.files
.
lotto.patch('/profile', ({ req, res}) => {
const { name, email } = req.body;
// picture é o nome do campo passado na requisição.
const { picture } = req.files;
...
})
lotto.patch('/profile', ({ req, res}) => {
const { name, email } = req.body;
// picture é o nome do campo passado na requisição.
const { picture } = req.files;
...
})
PS: Também temos um helper para ajudá-lo a recuperar arquivos de uma forma mais fácil, veja mais no método req.file()
Form URL Encoded
O conteúdo que vem de um request application/x-www-form-urlencoded
tem o mesmo tratamento de uma solicitação JSON e os dados vão para o req.body
.
lotto.patch('/profile', ({ req, res}) => {
const { name, email } = req.body;
...
})
lotto.patch('/profile', ({ req, res}) => {
const { name, email } = req.body;
...
})
Uma coisa interessante é que também tratamos arrays na requisição. Digamos que você tenha um campo chamado fruits
e queira enviá-lo como um form url encoded e o campo é um array de strings, você pode fazer o seguinte:
Na sua solicitação envie 2 campos chamados fruits[]
com seu conteúdo e basicamente receba no objeto req.body
.
lotto.patch('/fruits', ({ req, res}) => {
const { fruits } = req.body;
// objeto fruits será
// [
// 'banana',
// 'abacaxi'
// ]
...
})
lotto.patch('/fruits', ({ req, res}) => {
const { fruits } = req.body;
// objeto fruits será
// [
// 'banana',
// 'abacaxi'
// ]
...
})
JSON
A maneira mais comum, os dados vão para o objeto req.body
quando você está usando o tipo de conteúdo application/json
.
lotto.patch('/profile', ({ req, res}) => {
const { name, email } = req.body;
...
})
lotto.patch('/profile', ({ req, res}) => {
const { name, email } = req.body;
...
})
Text Plain
Você também pode receber dados como texto ao usar o Content-Type text/plain
e os dados também vão para o objeto req.body
mas agora será uma string em vez de um objeto.
lotto.patch('/profile', ({ req, res}) => {
const text = req.body;
...
})
lotto.patch('/profile', ({ req, res}) => {
const text = req.body;
...
})
Uso Autônomo
Também é possível utilizá-lo de forma autônoma em outros projetos que não utilizem o Lotto
.
Ao exportar uma função chamada bodyParser
que retorna uma função onde você pode passar o objeto req
vindo do seu servidor http e também uma função next
para que seu projeto possa executar as próximas chamadas.
import { createServer } from 'node:http';
import { paramsParser } from '@lottojs/body-parser';
createServer(
async (req: IncomingMessage, res: ServerResponse) => {
...
if (['POST', 'PUT', 'PATCH'].includes(req.method)) {
bodyParser()(req, next())
}
...
},
)
import { createServer } from 'node:http';
import { paramsParser } from '@lottojs/body-parser';
createServer(
async (req: IncomingMessage, res: ServerResponse) => {
...
if (['POST', 'PUT', 'PATCH'].includes(req.method)) {
bodyParser()(req, next())
}
...
},
)
Github
Se você estiver interessado em saber como funciona mais profundamente, dê uma olhada no código no Github.