Express.js req.body undefined - PullRequest
       24

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 ]

9 голосов
/ 04 апреля 2013

express.bodyParser () необходимо указать, какой тип содержимого он анализирует.Поэтому вам необходимо убедиться, что при выполнении запроса POST вы включаете заголовок «Content-Type».В противном случае bodyParser может не знать, что делать с телом вашего запроса POST.

Если вы используете curl для выполнения запроса POST, содержащего некоторый объект JSON в теле, это будет выглядеть примерно так:

curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute

Если используется другой метод, просто установите это поле заголовка, используя любое соглашение.

8 голосов
/ 27 августа 2018

Вы можете попробовать добавить эту строку кода вверху (после ваших требований require):

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

Что касается причин, почему это работает, ознакомьтесь с документами: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions

6 голосов
/ 13 ноября 2018

Используйте app.use (bodyparser.json ()); перед маршрутизацией.//app.use ("/ api", маршруты);

5 голосов
/ 18 июля 2015

Это произошло со мной сегодня. Ни одно из вышеперечисленных решений не работает для меня. Но небольшое прибегание к помощи помогло мне решить эту проблему. Я пишу для wechat стороннего сервера.

Все становится немного сложнее, когда вашему приложению node.js требуется чтение потоковых данных POST, например, запрос от клиента REST. В этом случае для свойства запроса «readable» будет задано значение true, а данные POST должны читаться порциями, чтобы собрать весь контент.

http://www.primaryobjects.com/CMS/Article144

4 голосов
/ 18 февраля 2014

Для работы вам необходимо app.use (app.router) после app.use (express.bodyParser ()) , например:

app.use(express.bodyParser())
   .use(express.methodOverride())
   .use(app.router);
4 голосов
/ 18 февраля 2016
var bodyParser = require('body-parser');
app.use(bodyParser.json());

Это спасло мой день.

4 голосов
/ 16 августа 2017

Потрачено впустую много времени:

В зависимости от типа контента в вашем клиенте запросе
сервер должен иметь другое значение, одно из следующих app.use ():

app.use(bodyParser.text({ type: 'text/html' }))
app.use(bodyParser.text({ type: 'text/xml' }))
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
app.use(bodyParser.json({ type: 'application/*+json' }))

Источник: https://www.npmjs.com/package/body-parser#bodyparsertextoptions

Пример:

Для меня На стороне клиента у меня был заголовок ниже:

Content-Type: "text/xml"

Итак, на стороне сервера я использовал:

app.use(bodyParser.text({type: 'text/xml'}));

Затем все работало нормально.

2 голосов
/ 06 февраля 2019

Я решил это с помощью:

app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});
2 голосов
/ 22 апреля 2019

Эта проблема может быть из-за того, что вы не используете body-parser ( link )

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

var app = express();
app.use(bodyParser.json());
2 голосов
/ 30 марта 2018

Вы можете использовать экспресс парсер тела.

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...