it-swarm.com.ru

Как получить 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, он работает, так что ... есть идеи?

694
murvinlai

Вещи изменились снова запустив Express 4.16.0, теперь вы можете использовать express.json() и express.urlencoded(), как в Express 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
})); 

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

1122
Drew Noakes

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

Если вы используете connect/express, вы должны использовать bodyParser middleware : Это описано в Expressjs guide .

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

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

80
yonran

Проблема безопасности с использованием 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

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

79
Sean Lynch

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

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

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

29
med116

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

Учитывая некоторую форму: 

<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
18
David
app.use(express.bodyParser());

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

14
Chinthaka Senanayaka

Обновление для 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 и многочастного парсера, например, грозного, connect-multiparty. (Multipart middleware также не рекомендуется).

Также помните, что, просто определяя 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
yeelan

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

Я искал именно эту проблему. Я следовал всем советам выше, но 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}

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

7
cwingrav

Для 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-data

7
Lalit Umbarkar

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

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

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

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

5
HenioJR

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

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

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

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

2
ARUNBALAN NV

использовать пакет 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');
});
0
Chirag
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');
}
0
HamidKhan

Вы используете '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»

0
sagar saini
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");
})
0
seme