Express.js req.body undefined

У меня это как конфигурация моего 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());, но, как вы видите, я вызываю ее перед маршрутами.

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

Ответ 1

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

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

вместо

app.use(express.bodyParser());

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

Ответ 2

Вы должны убедиться, что вы определяете все конфигурации ПЕРЕД определением маршрутов. Если вы это сделаете, вы можете продолжать использовать 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' });
});

Ответ 3

В последних версиях 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())

Ответ 4

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

Ответ 5

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

npm install body-parser --save

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

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

app.use(bodyParser.json());

Ответ 6

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

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

Ответ 7

Express 4, имеет встроенный анализатор тела. Нет необходимости устанавливать отдельный тег-парсер. Итак, ниже будет работать:

export const app = express();
app.use(express.json());

Ответ 8

// 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())

Ответ 9

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

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.

Ответ 10

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

http://example.com/api/

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

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

и тогда у меня было следующее

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

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

окончательный

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

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

Добавьте в свой app.js

до вызова роутера

const app = express();
app.use(express.json());

Ответ 14

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

Ответ 15

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

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

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

Ответ 16

Эта проблема может быть связана с тем, что вы не используете анализатор тела (ссылка)

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

var app = express();
app.use(bodyParser.json());

Ответ 17

Чтобы работать, вам нужно app.use(app.router) после app.use(express.bodyParser()), например:

app.use(express.bodyParser())
   .use(express.methodOverride())
   .use(app.router);

Ответ 18

var bodyParser = require('body-parser');
app.use(bodyParser.json());

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

Ответ 19

Отработано много времени:

В зависимости от типа содержимого в запросе клиента сервер должен иметь разные значения, один из следующих ниже: 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'}));

Затем req.body работал нормально.

Ответ 20

Это также одна из возможностей: Убедитесь, что вы должны написать этот код перед маршрутом в файле app.js (или index.js).

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

Ответ 21

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

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));

Ответ 22

Я решил это с:

app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});

Ответ 23

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

const express = require('express);
... 
app.use(express.urlencoded({ extended: false }))
.use(express.json());

Ответ 24

Если вы отправляете сообщение SOAP, вам нужно использовать сырой парсер:

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

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

Ответ 25

Основываясь на @kevin-xue, нужно указать тип контента. В моем случае это происходило только с IE9, потому что XDomainRequest не задавал тип содержимого, поэтому bodyparser и expressjs игнорировали тело запрос.

Я обошел это, явно задав тип содержимого, прежде чем передать запрос через тело-парсер, например:

app.use(function(req, res, next) {
    // IE9 doesn't set headers for cross-domain ajax requests
    if(typeof(req.headers['content-type']) === 'undefined'){
        req.headers['content-type'] = "application/json; charset=UTF-8";
    }
    next();
})
.use(bodyParser.json());

Ответ 26

Кредит @spikeyang за отличный ответ (см. ниже). Прочитав предложенную статью, прикрепленную к сообщению, я решил поделиться своим решением.

Когда использовать?

Решение потребовало, чтобы вы использовали экспресс-маршрутизатор, чтобы пользоваться им. Если вы пытаетесь использовать принятый ответ без везения, просто используйте эту функцию:

function bodyParse(req, ready, fail) 
{
    var length = req.header('Content-Length');

    if (!req.readable) return fail('failed to read request');

    if (!length) return fail('request must include a valid `Content-Length` header');

    if (length > 1000) return fail('this request is too big'); // you can replace 1000 with any other value as desired

    var body = ''; // for large payloads - please use an array buffer (see note below)

    req.on('data', function (data) 
    {
        body += data; 
    });

    req.on('end', function () 
    {
        ready(body);
    });
}

и назовите его так:

bodyParse(req, function success(body)
{

}, function error(message)
{

});

Примечание: Для больших полезных нагрузок используйте буфер массива (больше @MDN)

Ответ 27

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

Content-Type: application/json

Ответ 28

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

Вы можете сделать это либо:

  1. Загрузка и включение расширения CORS для вашего браузера, например:

    https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

    для Chrome,

или

  1. Добавление строк

    var cors=require('cors');
    
    app.use(cors());
    

на вашу экспресс-страницу app.js (После npm install cors)

Ответ 29

Другой возможный способ получить пустой request.body, когда вы забудете атрибут name из элемента input...

<input type="text" /> /* give back empty request.body -> {}*/
<input type="text" name="username" /> /* give back request.body -> {"username": "your-input"} */

Ответ 30

В большинстве случаев req.body не определено из-за отсутствия парсера JSON

const express = require('express');
app.use(express.json());

может отсутствовать для анализатора тела

const bodyParser  = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));

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

const cors = require('cors');
app.use(cors())