Как получить параметры запроса POST? - PullRequest
728 голосов
/ 19 апреля 2011

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

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

Вот мой Express.js / Node.js код:

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

Я пытался sReq.query.emailили sReq.query['email'] или sReq.params['email'] и т. д. Ни один из них не работает.Все они возвращаются undefined.

Когда я переключаюсь на вызов Get, он работает, так что ... есть идеи?

Ответы [ 18 ]

1172 голосов
/ 17 августа 2012

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

Это отличается начинается Экспресс 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
})); 

Остальноекак в Express 3.0 :

Во-первых, вам нужно добавить промежуточное программное обеспечение для анализа почтовых данных тела.

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

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

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

// assuming POST: name=foo&color=red            <-- URL encoding
//
// or       POST: {"name":"foo","color":"red"}  <-- JSON encoding

app.post('/test-page', function(req, res) {
    var name = req.body.name,
        color = req.body.color;
    // ...
});

Обратите внимание, что использование express.bodyParser() не рекомендуется.

app.use(express.bodyParser());

... эквивалентно:

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

Проблемы безопасности существуют с express.multipart(), поэтому лучше явно добавить поддержкудля конкретного типа (ов) кодирования вам требуется.Если вам нужно многочастное кодирование (например, для поддержки загрузки файлов), вам следует прочитать это .

84 голосов
/ 22 ноября 2013

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

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

Из-за проблемы безопасности с тем, как express.multipart() / connect.multipart() создает временные файлы для всех загруженных файлов (и не являются сборщиком мусора), теперь рекомендуется не использовать оболочку express.bodyParser(), а использовать только промежуточное программное обеспечение, которое вам нужно.

Примечание: connect.bodyParser() скоро будет обновлено и будет включать только urlencoded и json после выпуска Connect 3.0 (который Express расширяет).


Короче, вместо ...

app.use(express.bodyParser());

... вы должны использовать

app.use(express.urlencoded());
app.use(express.json());      // if needed

и если /когда вам нужно обрабатывать многокомпонентные формы (загрузка файлов), используйте стороннюю библиотеку или промежуточное ПО, такое какс многопартийностью, автобусом, диктором и т. д.

82 голосов
/ 19 апреля 2011

Примечание : этот ответ для 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.

30 голосов
/ 22 июля 2014

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

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

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

24 голосов
/ 11 мая 2014

Примечание для пользователей 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();
})
18 голосов
/ 20 января 2012

Дано некая форма:

<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
14 голосов
/ 12 июня 2014

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

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

  • bodyParser
  • 1008 * JSON *
  • urlencoded
  • многочастному

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

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


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

Поскольку bodyParser помечен как устаревший, поэтому я рекомендую следующий способ, используя json, urlencode и многочастный парсер, например, грозный, connect-multiparty. (Составное промежуточное программное обеспечение также устарело).

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

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);
14 голосов
/ 09 апреля 2012
app.use(express.bodyParser());

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

13 голосов
/ 05 августа 2016

Бэкэнд:

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
});
7 голосов
/ 30 августа 2015

Для Express 4.1 и выше

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

В качестве замены для connect.multipart () можно использовать Multer.

Чтобы установить пакет

$ npm install multer

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

var multer = require('multer');

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

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

connect.json () обрабатывает application / json

connect.urlencoded () обрабатывает application / x-www-formс кодировкой

multer () обрабатывает multipart / form-data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...