Aqui está o meu formulário simples:
<form id="loginformA" action="userlogin" method="post">
<div>
<label for="email">Email: </label>
<input type="text" id="email" name="email"></input>
</div>
<input type="submit" value="Submit"></input>
</form>
Aqui está o meu código Express.js /Node.js:
app.post('/userlogin', function(sReq, sRes){
var email = sReq.query.email.;
}
Eu tentei sReq.query.email
ou sReq.query['email']
ou sReq.params['email']
, etc. Nenhum deles funciona. Todos eles retornam undefined
.
Quando mudo para uma chamada Get, funciona, então ... alguma ideia?
javascript
node.js
post
express
murvinlai
fonte
fonte
bodyParser()
respostas aqui também devem ler a resposta deRespostas:
As coisas mudaram mais uma vez a partir do Express 4.16.0 , agora você pode usar
express.json()
e,express.urlencoded()
assim como no Express 3.0 .Isso foi diferente ao iniciar o Express 4.0 a 4.15 :
e depois:
O resto é como no Express 3.0 :
Primeiro, você precisa adicionar algum middleware para analisar os dados de postagem do corpo.
Adicione uma ou ambas as seguintes linhas de código:
Em seguida, no seu manipulador, use o
req.body
objeto:Observe que o uso de
express.bodyParser()
não é recomendado....é equivalente a:
Existem preocupações de segurança
express.multipart()
e, portanto, é melhor adicionar explicitamente suporte para os tipos de codificação específicos necessários. Se você precisar de codificação multiparte (para suportar o upload de arquivos, por exemplo), leia isso .fonte
content-type
cabeçalho está definido, por exemplo:curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"
bodyParser
abstrai JSON, dados codificados por URL e multipartes noreq.body
objeto.app.use(require('body-parser').json())
linha é suficiente. E então você pode ler os dados json do objeto body da sua solicitação, ou sejareq.body
, de dentro de uma definição de rota.Preocupação de segurança usando express.bodyParser ()
Enquanto todas as outras respostas recomendar atualmente usando o
express.bodyParser()
middleware, este é realmente um invólucro em torno doexpress.json()
,express.urlencoded()
eexpress.multipart()
middlewares ( http://expressjs.com/api.html#bodyParser ). A análise dos corpos de solicitação de formulário é feita peloexpress.urlencoded()
middleware e é tudo o que você precisa para expor seus dados de formulário noreq.body
objeto.Devido a uma preocupação de segurança sobre como
express.multipart()
/connect.multipart()
cria arquivos temporários para todos os arquivos carregados (e não são coletados de lixo), agora é recomendável não usar oexpress.bodyParser()
wrapper, mas usar apenas os middlewares necessários.Nota:
connect.bodyParser()
em breve será atualizado para incluir apenasurlencoded
ejson
quando o Connect 3.0 for lançado (que o Express estende).Então, resumindo, em vez de ...
...você deveria usar
e se / quando você precisar manipular formulários multipartes (upload de arquivos), use uma biblioteca ou middleware de terceiros, como multiparty, busboy, dicer, etc.
fonte
multipart()
como partebodyParser()
,bodyParser()
torna-se "seguro" novamente, mas você precisará ativar explicitamente o suporte a várias partes usando uma biblioteca de terceiros.Nota : esta resposta é para o Express 2. Consulte aqui para o Express 3.
Se você estiver usando o connect / express, deverá usar o middleware bodyParser : está descrito no guia Expressjs .
Aqui está a versão original somente para conexão:
A querystring e o body são analisados usando manipulação de parâmetro no estilo Rails (
qs
) em vez da biblioteca de baixo nívelquerystring
. A fim de analisar parâmetros repetidos comqs
, o parâmetro precisa ter parênteses:name[]=val1&name[]=val2
. Ele também suporta mapas aninhados. Além de analisar envios de formulários HTML, o bodyParser pode analisar solicitações JSON automaticamente.Editar : li o express.js e modifiquei minha resposta para ser mais natural para os usuários do Express.
fonte
Isso será feito se você deseja criar a consulta publicada sem o middleware:
Isso enviará isso para o navegador
Provavelmente é melhor usar o middleware para que você não precise escrever isso repetidamente em cada rota.
fonte
Nota para usuários do Express 4:
Se você tentar entrar
app.use(express.bodyParser());
no seu aplicativo, receberá o seguinte erro ao tentar iniciar o servidor Express:Você precisará instalar o pacote
body-parser
separadamente do npm e , em seguida, usar algo como o seguinte (exemplo da página do GitHub ):fonte
Dada alguma forma:
Usando express
Resultado:
fonte
Processo interno:
A parte dianteira:
fonte
Em seguida, para
app.post
solicitação, você pode obter valores de postagem viareq.body.{post request variable}
.fonte
Atualização para o Express 4.4.1
O middleware a seguir é removido do Express.
Quando você usa o middleware diretamente, como no express 3.0. Você receberá o seguinte erro:
Para utilizar esses middlewares, agora você precisa executar o npm para cada middleware separadamente.
Como bodyParser está marcado como obsoleto, recomendo a seguinte maneira usando json, urlencode e analisador de várias partes, como formidável, connect-multiparty. (O middleware de várias partes também está obsoleto).
Lembre-se também, apenas definindo urlencode + json, os dados do formulário não serão analisados e req.body será indefinido. Você precisa definir um middleware para lidar com a solicitação de várias partes.
fonte
Para o Express 4.1 e superior
Como a maioria das respostas está usando o Express, bodyParser, connect; onde multipart está obsoleto. Existe uma maneira segura de enviar objetos multipartes com facilidade.
Multer pode ser usado como substituto de connect.multipart ().
Para instalar o pacote
Carregue-o no seu aplicativo:
Em seguida, adicione-o na pilha de middleware junto com o outro formulário que analisa o middleware.
connect.json () manipula application / json
connect.urlencoded () manipula application / x-www-form-urlencoded
multer () lida com dados de várias partes / formulário
fonte
Eu estava procurando por esse problema exato. Eu estava seguindo todos os conselhos acima, mas req.body ainda estava retornando um objeto vazio {}. No meu caso, era algo tão simples quanto o html estar incorreto.
No html do seu formulário, use o
'name'
atributo em suas tags de entrada, não apenas'id'
. Caso contrário, nada será analisado.Meu erro idiota é o seu benefício.
fonte
Você não deve usar app.use (express.bodyParser ()) . BodyParser é uma união de json + urlencoded + mulitpart. Você não deve usar isso porque o multipart será removido no connect 3.0.
Para resolver isso, você pode fazer o seguinte:
É muito importante saber que o app.use (app.router) deve ser usado após o json e o código da URL , caso contrário não funciona!
fonte
O fluxo de pedidos funcionou para mim
fonte
postdata.split("&")
seria carregar módulo centralquerystring = require('querystring')
e, em seguida, analisar o seupostdata
comquerystring.parse(postdata)
;Eu pude encontrar todos os parâmetros usando o código a seguir para solicitações POST e GET .
fonte
Escrito na versão Express 4.16
Dentro da função do roteador, você pode usar a
req.body
propriedade para acessar a variável post. Por exemplo, se esse era oPOST
caminho do seu formulário, ele enviaria de volta o que você inseriu:PS para aqueles que estão familiarizados com o PHP: Para acessar a
$_GET
variável do PHP , usamosreq.query
e para acessar a$_POST
variável do PHP , usamosreq.body
no Node.js.fonte
fonte
Os parâmetros de postagem podem ser recuperados da seguinte maneira:
fonte
param
é usado para solicitações GET .. não POST e seu exemplo carece de detalhes, muito confuso para os novatos. Além disso, elerequest.param
está realmente obsoleto, então seu exemplo está errado em muitos níveis.Você está usando o
req.query.post
método errado,req.query.post
trabalha commethod=get
,method=post
trabalha com o analisador de corpo .Apenas tente isso alterando a postagem para obter :
E no código expresso, use 'app.get'
fonte
Use o pacote express-fileupload :
fonte