Express.js req.body undefined - PullRequest
       25

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 ]

1 голос
/ 18 марта 2019

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

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
1 голос
/ 05 декабря 2018

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

Content-Type: application/json

1 голос
/ 03 июля 2015

В случае, если вы публикуете сообщение SOAP, вам нужно использовать синтаксический анализатор raw body:

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

app.use(bodyParser.raw({ type: 'text/xml' }));
1 голос
/ 26 августа 2015

Опираясь на @ 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());
1 голос
/ 04 апреля 2017

Кредит @ 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)
{

});

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

0 голосов
/ 02 июля 2019

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

const express = require('express);
... 
app.use(express.urlencoded({ extended: false }))
.use(express.json());
0 голосов
/ 13 июля 2019

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

Это можно сделать одним из следующих способов:

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

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

    для Chrome,

или

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

var cors=require('cors');

app.use(cors());

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

0 голосов
/ 10 апреля 2019

Добавьте ваш app.js.
перед вызовом маршрутизатора.

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

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