Как получить параметры запроса 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>

Вот мой 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, он работает, поэтому.. любая идея?

Ответ 1

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

Это отличалось, начиная с Express 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(), поэтому лучше явно добавить поддержку для конкретного типа (типов) кодирования, который вам требуется. Если вам нужно многокомпонентное кодирование (например, для поддержки загрузки файлов), вам следует прочитать это.

Ответ 2

Проблема безопасности с помощью функции 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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Для некоторой формы:

<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

Ответ 7

app.use(express.bodyParser());

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

Ответ 8

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

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

  • bodyParser
  • 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 и multipart parser как грозный, connect-multiparty. (Многостраничное промежуточное программное обеспечение также устарело).

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

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

Ответ 9

Backend:

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

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

Frontend:

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

Ответ 10

Для Express 4.1 и выше

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

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

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

$ npm install multer

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

var multer = require('multer');

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

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

connect.json() обрабатывает приложение /json

connect.urlencoded() обрабатывает приложение /x -www-form-urlencoded

multer() обрабатывает данные multipart/form

Ответ 11

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

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

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

Моя ошибка идиота - ваша польза.

Ответ 12

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

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

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

Очень важно знать, что app.use(app.router) следует использовать после json и urlencoded, иначе это не сработает!

Ответ 13

Работа со службой запросов для меня

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

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

Ответ 14

Я мог бы найти все параметры, используя следующий код для запросов POST и 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));
})

Ответ 15

Параметры публикации могут быть получены следующим образом:

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');
}

Ответ 16

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");
})

Ответ 17

Используйте пакет 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');
});

Ответ 18

Вы используете req.query.post с неверным методом req.query.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>

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

Ответ 19

Написано в Express версии 4.16

Внутри функции маршрутизатора вы можете использовать свойство req.body для доступа к переменной post. Например, если это был маршрут POST вашей формы, он вернул бы то, что вы ввели:

function(req,res){
      res.send(req.body);

      //req.body.email would correspond with the HTML <input name="email"/>
}

P.S. для тех, кто знаком с PHP: для доступа к переменной PHP $_GET мы используем req.query, а для доступа к переменной PHP $_POST мы используем req.body в Node.js.