Express.js req.body undefined - PullRequest
       23

Express.js req.body undefined

225 голосов
/ 07 февраля 2012

У меня есть это как конфигурация моего сервера Express

app.use(app.router); 
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());

Но все же, когда я запрашиваю req.body.something в моих маршрутах, я получаю некоторую ошибку, указывающую, что body is undefined.Вот пример маршрута, который использует req.body:

app.post('/admin', function(req, res){
    console.log(req.body.name);
});

Я прочитал, что эта проблема вызвана отсутствием app.use(express.bodyParser());, но, как вы можете видеть, я вызываю его перед маршрутами.

Любая подсказка?

Ответы [ 28 ]

252 голосов
/ 08 декабря 2012

Вы должны убедиться, что вы определили все конфигурации ДО определения маршрутов.Если вы это сделаете, вы можете продолжать использовать express.bodyParser().

Пример:

var express = require('express'),
    app     = express(),
    port    = parseInt(process.env.PORT, 10) || 8080;

app.configure(function(){
  app.use(express.bodyParser());
  app.use(app.router);
});

app.listen(port);

app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.send({ status: 'SUCCESS' });
});
218 голосов
/ 09 января 2015

Последние версии Express (4.x) отделили промежуточное программное обеспечение от базовой платформы.Если вам нужен анализатор тела, вам нужно установить его отдельно

npm install body-parser --save

, а затем сделать это в своем коде

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

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())
59 голосов
/ 07 февраля 2012

Нет.Вам нужно использовать app.use(express.bodyParser()) до app.use(app.router).На самом деле, app.use(app.router) должно быть последним, что вы называете.

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

Сначала убедитесь, что вы установили модуль npm с именем 'body-parser', вызвав:

npm install body-parser --save

Затем убедитесь, что вы включили следующие строки перед вызовом маршрутов

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

app.use(bodyParser.json());
34 голосов
/ 04 июля 2013

Content-Type в заголовке запроса действительно важен, особенно когда вы публикуете данные из curl или любых других инструментов.

Убедитесь, что вы используете что-то вроде application / x-www-form-urlencoded, application / json или других, это зависит от ваших почтовых данных. Оставьте это поле пустым, чтобы запутать Express.

32 голосов
/ 09 февраля 2012

Как уже было написано под одним комментарием, я решил это, используя

app.use(require('connect').bodyParser());

вместо

app.use(express.bodyParser());

Я до сих пор не знаю, почему простое express.bodyParser() не работает...

20 голосов
/ 02 апреля 2017
// Require body-parser (to receive post data from clients)

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

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

// parse application/json

app.use(bodyParser.json())
17 голосов
/ 28 июня 2018

Express 4, имеет встроенный парсер тела. Не нужно устанавливать отдельный body-parser. Так что ниже будет работать:

export const app = express();
app.use(express.json());
10 голосов
/ 28 июня 2018

На случай, если кто-нибудь столкнется с той же проблемой, что и я;Я использую префикс url, например

http://example.com/api/

, который был настроен с маршрутизатором

app.use('/api', router); 

, а затем у меня было следующее

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

Что устранило мою проблемуразмещение конфигурации bodyparser выше app.use('/api', router);

Final

// setup bodyparser
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

//this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route
    app.use('/api', router); 
10 голосов
/ 21 июля 2014

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

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

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.json())

// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }))
app.use(function (req, res, next) {
console.log(req.body) // populated!

Обратитесь к странице git https://github.com/expressjs/body-parser для получения дополнительной информации и примеров.

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