Se você usar o Express (desenvolvimento da Web de alto desempenho e classe para o Node.js), poderá fazer o seguinte:
HTML:
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
Cliente da API:
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user: {
name: "John",
email: "[email protected]"
}
})
});
Node.js: (desde o Express v4.16.0)
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
// Access the parse results as request.body
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
Node.js: (para Express <4.16.0)
const bodyParser = require("body-parser");
/** bodyParser.urlencoded(options)
* Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
* and exposes the resulting object (containing the keys and values) on req.body
*/
app.use(bodyParser.urlencoded({
extended: true
}));
/**bodyParser.json(options)
* Parses the text as JSON and exposes the resulting object on req.body.
*/
app.use(bodyParser.json());
app.post("/", function (req, res) {
console.log(req.body.user.name)
});
app.use(express.bodyParser());
.Você pode usar o
querystring
módulo:Agora, por exemplo, se você tiver um
input
campo com nomeage
, poderá acessá-lo usando a variávelpost
:fonte
var POST = qs.parse(body); // use POST
somente para noobs como eu: quando o nome do campo de texto de entrada for "usuário",Post.user
mostrará os dados desse campo. por exemploconsole.log(Post.user);
readable
retorno de chamada em vez de criar os dados em uma cadeia de caracteres do corpo. Uma vez que é acionado, o corpo está disponível atravésrequest.read();
req.connection.destroy();
não impede que os retornos de chamada sejam executados! Por exemplo, o retorno de chamada "on end" será executado com o corpo truncado! Isto provavelmente não é o que você quer ...Certifique-se de matar a conexão se alguém tentar inundar sua RAM!
fonte
var POST = qs.parse(body); // use POST
somente para noobs: quando o nome do campo de texto de entrada for "usuário", o Post.user mostrará os dados desse campo. por exemplo console.log (Post.user);Muitas respostas aqui não são mais boas práticas ou não explicam nada, por isso estou escrevendo isso.
Fundamentos
Quando o retorno de chamada de http.createServer é chamado, é quando o servidor realmente recebeu todos os cabeçalhos da solicitação, mas é possível que os dados ainda não tenham sido recebidos, por isso precisamos aguardar. O objeto de solicitação http (uma instância http.IncomingMessage) é na verdade um fluxo legível . Em fluxos legíveis sempre que um pedaço de dados chega, um evento é emitido (supondo que você tenha registrado um retorno de chamada) e quando todos os pedaços chegaram, um evento é emitido. Aqui está um exemplo de como você escuta os eventos:
data
end
Convertendo buffers em seqüências de caracteres
Se você tentar isso, notará que os pedaços são buffers . Se você não está lidando com dados binários e precisa trabalhar com strings, sugiro usar o método request.setEncoding que faz com que o fluxo emita strings interpretadas com a codificação especificada e lida com caracteres de vários bytes corretamente.
Pedaços de buffer
Agora você provavelmente não está interessado em cada pedaço por si só, portanto, nesse caso, provavelmente você deseja armazená-lo da seguinte maneira:
Aqui é usado o Buffer.concat , que simplesmente concatena todos os buffers e retorna um grande buffer. Você também pode usar o módulo concat-stream, que faz o mesmo:
Analisando Conteúdo
Se você está tentando aceitar HTML formulários de apresentação POST com nenhum arquivo ou distribuindo ajax jQuery chamadas com o tipo de conteúdo padrão, em seguida, o tipo de conteúdo é
application/x-www-form-urlencoded
comuft-8
codificação. Você pode usar o módulo querystring para desserializá-lo e acessar as propriedades:Se o seu tipo de conteúdo for JSON, você poderá simplesmente usar JSON.parse em vez de qs.parse .
Se você estiver lidando com arquivos ou lidando com o tipo de conteúdo com várias partes, nesse caso, você deve usar algo como formidável, que remove toda a dor de lidar com ele. Dê uma olhada nesta outra resposta minha, onde eu postei links e módulos úteis para conteúdo de várias partes.
Tubulação
Se você não deseja analisar o conteúdo, mas passá-lo para outro lugar, por exemplo, envie-o para outra solicitação http como dados ou salve-o em um arquivo. Sugiro canalizá-lo em vez de armazená- lo em buffer, pois será menos código, lida melhor com a contrapressão, será preciso menos memória e, em alguns casos, mais rápido.
Então, se você deseja salvar o conteúdo em um arquivo:
Limitando a quantidade de dados
Como outras respostas observadas, lembre-se de que clientes mal-intencionados podem enviar uma quantidade enorme de dados para travar seu aplicativo ou encher sua memória, de modo a proteger, a fim de proteger as solicitações que emitem dados que ultrapassam um determinado limite. Se você não usar uma biblioteca para manipular os dados recebidos. Eu sugeriria usar algo como medidor de fluxo que pode abortar a solicitação se atingir o limite especificado:
ou
ou
Módulos NPM
Enquanto eu descrevi acima sobre como você pode usar o corpo da solicitação HTTP, para simplesmente armazenar em buffer e analisar o conteúdo, sugiro o uso de um desses módulos em vez de implementar por conta própria, pois eles provavelmente irão lidar melhor com casos extremos. Para expressar, sugiro usar o analisador de corpo . Para o koa, há um módulo semelhante .
Se você não usa uma estrutura, o corpo é muito bom.
fonte
request
é reutilizada e arequest.on('end')
chamada várias vezes? Como posso evitar isso?request.on('end', ...)
será chamado.Aqui está um wrapper sem estrutura muito simples, com base nas outras respostas e artigos publicados aqui:
Exemplo de uso:
fonte
response.post
e não o mais lógicorequest.post
. Eu atualizei a postagem.Será mais limpo se você codificar seus dados para JSON e enviá-los para Node.js.
fonte
qs.parse()
,JSON.parse()
transformou o corpo em algo utilizável. Exemplovar post = JSON.parse(body);
:, acesse os dados compost.fieldname
. (Moral da história, se você está confuso sobre o que você está vendo, não se esqueçatypeof
!)request.setEncoding
fazer isso funcionar corretamente, caso contrário, ele pode não manipular caracteres não ascii corretamente.Para quem quer saber como fazer essa tarefa trivial sem instalar uma estrutura da web, eu consegui resolver isso juntos. Dificilmente a produção está pronta, mas parece funcionar.
fonte
Você pode usar
body-parser
o corpo do Node.js para analisar o middleware.Primeira carga
body-parser
Algum código de exemplo
Mais documentação pode ser encontrada aqui
fonte
Referência: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
fonte
Aqui está como você pode fazer isso se usar o form-node :
fonte
Se você preferir usar o Node.js puro, poderá extrair dados do POST, como mostrado abaixo:
fonte
1) Instale a
'body-parser'
partir das npm.2) Em seguida, no seu app.ts
3) então você precisa escrever
no módulo app.ts
4) lembre-se de incluir
na parte superior ou antes de qualquer declaração de módulo.
Ex:
5) Então use
fonte
Se você não deseja agrupar seus dados com o
data
retorno de chamada, sempre poderá usá-lo dareadable
seguinte maneira:Essa abordagem modifica a solicitação recebida, mas assim que você terminar sua resposta, a solicitação será coletada como lixo, para que isso não seja um problema.
Uma abordagem avançada seria verificar primeiro o tamanho do corpo, se você tiver medo de corpos enormes.
fonte
request
é um fluxo node.js normal, para que você possa verificar orequest.headers
comprimento do corpo e abortar a solicitação, se necessário.Existem várias maneiras de fazer isso. No entanto, a maneira mais rápida que conheço é usar a biblioteca Express.js com o analisador de corpo.
Isso pode funcionar para seqüências de caracteres, mas eu mudaria bodyParser.urlencoded para bodyParser.json, se os dados POST contiverem uma matriz JSON.
Mais informações: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/
fonte
Você precisa receber os
POST
dados em pedaços usandorequest.on('data', function(chunk) {...})
Você deve adicionar um limite de tamanho na posição indicada, como sugerido pelo jh .
fonte
setTimeout
que encerre a conexão após um certo período de tempo, se a solicitação completa não for recebida nessa janela.Express v4.17.0
fonte
Se você estiver usando o Express.js , antes de poder acessar o req.body, adicione o middleware bodyParser:
Então você pode pedir
fonte
E se você não quiser usar toda a estrutura, como o Express, mas também precisar de diferentes tipos de formulários, incluindo uploads, a formalina pode ser uma boa escolha.
Ele está listado nos módulos Node.js.
fonte
Encontrei um vídeo que explica como conseguir isso: https://www.youtube.com/watch?v=nuw48-u3Yrg
Ele usa o módulo "http" padrão juntamente com os módulos "querystring" e "stringbuilder". O aplicativo pega dois números (usando duas caixas de texto) de uma página da Web e, após o envio, retorna a soma desses dois (juntamente com a persistência dos valores nas caixas de texto). Este é o melhor exemplo que eu poderia encontrar em qualquer outro lugar.
Código fonte relacionado:
fonte
Para aqueles que usam o upload binário bruto do POST sem sobrecarga de codificação, você pode usar:
cliente:
servidor:
fonte
Você pode usar o middleware expresso , que agora possui um analisador de corpo incorporado. Isso significa que tudo que você precisa fazer é o seguinte:
Esse exemplo de código é ES6 com o Express 4.16.x
fonte
você pode extrair o parâmetro post sem usar o express.
1:
nmp install multiparty
2: importar multipartidário. Como
var multiparty = require('multiparty');
3: `
4: e HTML FORM IS.
Espero que isso funcione para você. Obrigado.
fonte
Limite o tamanho do POST para evitar inundar o aplicativo do nó. Existe um ótimo módulo de corpo bruto , adequado tanto para expresso quanto para conexão, que pode ajudá-lo a limitar a solicitação por tamanho e comprimento.
fonte
Se envolver um upload de arquivo, o navegador normalmente o envia como um
"multipart/form-data"
tipo de conteúdo. Você pode usar isso nesses casosReferência 1
Referência 2
fonte
Em campos de formulário como estes
algumas das respostas acima falharão porque suportam apenas dados simples.
Por enquanto, estou usando a resposta Casey Chu, mas com o "qs" em vez do módulo "querystring". Este é o módulo "body-parser" também usa. Portanto, se você quiser dados aninhados, precisará instalar o qs.
Em seguida, substitua a primeira linha como:
fonte
Você pode enviar e obter facilmente a resposta da solicitação POST usando "Solicitação - cliente HTTP simplificado" e Promessa Javascript.
fonte
Você precisa usar bodyParser () se quiser que os dados do formulário estejam disponíveis em req.body. O analisador de corpo analisa sua solicitação e a converte em um formato do qual você pode extrair facilmente as informações relevantes necessárias.
Por exemplo, digamos que você tenha um formulário de inscrição no seu front-end. Você está preenchendo e solicitando ao servidor que salve os detalhes em algum lugar.
Extrair o nome de usuário e a senha da sua solicitação é tão simples quanto abaixo se você usar o analisador de corpo.
…………………………………………………….
fonte
ONE LINER sem MIDDLEWARE
Se você publicar os seguintes dados,
'name':'ABC'
poderá analisá-los usando o seguinte liner,
fonte