Как получить параметры запроса POST?

вот моя простая форма:

<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>

вот мой Экспресс.js/узла.код js:

app.post('/userlogin', function(sReq, sRes){    
    var email = sReq.query.email.;   
}

пробовал sReq.query.email или sReq.query['email'] или sReq.params['email'], etc. Ни один из них не работает. Они все возвращаются!--5-->.

когда я перехожу на вызов Get, он работает, так что .. есть идеи?

18 ответов


вещи изменить еще раз начиная с Экспресс 4.16.0, теперь вы можете использовать express.json() и express.urlencoded() как и в Экспресс 3.0.

это разные начиная с Экспресс 4.0 до 4,15:

$ npm install --save body-parser

и затем:

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

остальное как в Экспресс 3.0:

во-первых, вам нужно добавить некоторое промежуточное ПО для анализа данных post тело.

добавить одну или обе из следующих строк кода:

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

затем, в обработчике, используйте req.body


Примечание: этот ответ для Express 2. См.здесь для Express 3.

если вы используете connect / express, вы должны использовать промежуточное ПО bodyParser: это описано в руководство Expressjs.

// example using express.js:
var express = require('express')
  , app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
  var email = req.param('email', null);  // second parameter is default
});

вот оригинальная версия только для подключения:

// example using just connect
var connect = require('connect');
var url = require('url');
var qs = require('qs');
var server = connect(
  connect.bodyParser(),
  connect.router(function(app) {
    app.post('/userlogin', function(req, res) {
      // the bodyParser puts the parsed request in req.body.
      var parsedUrl = qs.parse(url.parse(req.url).query);
      var email = parsedUrl.email || req.body.email;;
    });
  })
);

и строка запроса, и тело анализируются с помощью Rails-обработка параметров стиля (qs) а не низкий уровень querystring библиотека. Для разбора повторяющихся параметров с помощью qs параметр должен иметь скобки: name[]=val1&name[]=val2. Он также поддерживает вложенные карты. Помимо синтаксического анализа HTML-форм, bodyParser может автоматически анализировать запросы JSON.

редактировать: Я читал на express.js и изменил мой ответ, чтобы быть более естественным для пользователей Express.


проблема безопасности с помощью express.bodyParser()

в то время как все другие ответы в настоящее время рекомендуют использовать express.bodyParser() middleware, это на самом деле обертка вокруг express.json(), express.urlencoded() и express.multipart() middlewares (http://expressjs.com/api.html#bodyParser). Разбор форму запроса органов осуществляется express.urlencoded() middleware и это все, что вам нужно предоставить форму данных о


это сделает это, если вы хотите построить опубликованный запрос без промежуточного программного обеспечения:

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});

это отправит это в браузер

email=emailval&password1=pass1val&password2=pass2val

вероятно, лучше использовать промежуточное ПО, хотя вам не нужно писать это снова и снова в каждом маршруте.


Примечание Для пользователей Express 4:

Если вы попытаетесь поставить app.use(express.bodyParser()); в ваше приложение, вы получите следующую ошибку при попытке запустить сервер Express:

ошибка: большинство промежуточного ПО (например, bodyParser) больше не поставляется в комплекте с Express и должны быть установлены отдельно. Пожалуйста, смотрите https://github.com/senchalabs/connect#middleware.

вам придется установить пакет body-parser отдельно от npm, а затем использовать что-то вроде следующего (пример взят из страница GitHub):

var express    = require('express');
var bodyParser = require('body-parser');

var app = express();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})

дана некоторая форма:

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

на

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});

выход:

{"name":"x","description":"x"}
req.param.name x

app.use(express.bodyParser());

потом app.post запрос вы можете получить значения через req.body.{post request variable}.


обновление для Express 4.4.1

промежуточного следующие удалении из Express.

  • bodyParser
  • в формате JSON
  • urlencoded
  • multipart

когда вы используете промежуточное ПО напрямую, как в express 3.0. Вы получите следующую ошибку:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


Чтобы использовать эти промежуточные программы, теперь вам нужно сделать НПМ для каждого промежуточного отдельно.

поскольку bodyParser помечен как устаревший, поэтому я рекомендую следующий способ использования JSON, urlencode и multipart parser, таких как formidable, connect-multiparty. (Multipart middleware также устарел).

также помните, просто определяя urlencode + json, данные формы не будут анализироваться и req.тело будет неопределенным. Необходимо определить промежуточное обработки сложного запроса.

var urlencode = require('urlencode');
var json = require('json-middleware');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.use(json);
app.use(urlencode);
app.use('/url/that/accepts/form-data', multipartMiddleware);

бэкэнд:

import express from 'express';
import bodyParser from 'body-parser';

const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)

app.post('/api/courses', (request, response) => {
  response.json(request.body);
});

интерфейс:

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // stringify JSON
  headers: new Headers({ "Content-Type": "application/json" }); // add headers
});

для Express 4.1 и выше

поскольку большинство ответов используются для выражения, bodyParser, connect; где multipart устарел. Существует безопасный способ отправки post multipart объектов легко.

Multer можно использовать как замена для соединяется.составной.)(

для установки пакета

$ npm install multer

загрузите его в приложение:

var multer = require('multer');

а затем добавьте его в стек промежуточного программного обеспечения вместе с другим синтаксическим анализом формы промежуточное программное обеспечение.

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

подключиться.в JSON() обрабатывает приложение / json

подключиться.в кодировке url() обрабатывает приложение / x-www-form-urlencoded

мултэр() обрабатывает multipart / form-data


Я искал эту точную проблему. Я следовал всем советам, но Треб.тело все еще возвращало пустой объект {}. В моем случае это было так же просто, как неправильный html.

в html вашей формы убедитесь, что вы используете 'name' атрибут в ваших входных тегах, а не только 'id'. В противном случае ничего не анализируется.

<input id='foo' type='text' value='1'/>             // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}

моя идиотская ошибка-ваша выгода.


вы не должны использовать app.использовать(экспресс.bodyParser()). BodyParser-это объединение json + urlencoded + mulitpart. Вы не должны использовать это, потому что multipart будет удален в connect 3.0.

чтобы решить эту проблему, вы можете сделать следующее:

app.use(express.json());
app.use(express.urlencoded());

очень важно знать, что app.использование (app.маршрутизатор) следует использовать после JSON и urlencoded, иначе он не работает!


потоковая передача запросов работала для меня

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});

Я мог бы найти все параметры, используя следующий код для обоих в должности и GET запросы.

 var express = require('express');
    var app = express();
    const util = require('util');  
    app.post('/', function (req, res) {
        console.log("Got a POST request for the homepage");
        res.send(util.inspect(req.query,false,null));
    })

Post Parameters can be retrieved as follows-

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next)
{
   console.log(request.param("val1"));

   response.send('HI');
}

использовать пакет express-fileupload

var app = require('express')();
var http = require('http').Server(app);
const fileUpload = require('express-fileupload')

app.use(fileUpload());

app.post('/', function(req, res) {
var email = req.body.email;
res.send('<h1>Email :</h1> '+email);
});

http.listen(3000, function(){
  console.log('Running Port:3000');
});

var express        =         require("express");
var bodyParser     =         require("body-parser");
var app            =         express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/',function(req,res){
  res.sendfile("index.html");
});
app.post('/login',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log("User name = "+user_name+", password is "+password);
  res.end("yes");
});
app.listen(3000,function(){
  console.log("Started on PORT 3000");
})

вы используете ' req.запрос.сообщение "с неправильным методом" req.запрос.post 'работает с' method=get' 'method=post' работает с body-parser.

просто попробуйте это, изменив сообщение, чтобы получить

<form id="loginformA" action="userlogin" method="get">
<div>
    <label for="email">Email: </label>
    <input type="text" id="email" name="email"></input>
</div>
<input type="submit" value="Submit"></input>  
</form>

и в экспресс-коде используйте " приложение.get'