Ответ 1
Как уже было опубликовано в одном комментарии, я решил его использовать
app.use(require('connect').bodyParser());
вместо
app.use(express.bodyParser());
Я до сих пор не знаю, почему простой express.bodyParser()
не работает...
У меня это как конфигурация моего 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());
, но, как вы видите, я вызываю ее перед маршрутами.
Любая подсказка?
Как уже было опубликовано в одном комментарии, я решил его использовать
app.use(require('connect').bodyParser());
вместо
app.use(express.bodyParser());
Я до сих пор не знаю, почему простой express.bodyParser()
не работает...
Вы должны убедиться, что вы определяете все конфигурации ПЕРЕД определением маршрутов. Если вы это сделаете, вы можете продолжать использовать 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' });
});
В последних версиях 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())
Нет. Вам нужно использовать app.use(express.bodyParser())
до app.use(app.router)
. Фактически, app.use(app.router)
должно быть последним, что вы вызываете.
Сначала убедитесь, что вы установили модуль npm с именем body-parser, вызвав:
npm install body-parser --save
Затем убедитесь, что вы включили следующие строки перед вызовами маршрутов.
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
Заголовок Content-Type в заголовке запроса действительно важен, особенно когда вы публикуете данные из curl или любых других инструментов.
Убедитесь, что вы используете что-то вроде приложения /x -www-form-urlencoded, application/json или других, это зависит от ваших данных. Оставьте это поле пустым, путайте Express.
Express 4, имеет встроенный анализатор тела. Нет необходимости устанавливать отдельный тег-парсер. Итак, ниже будет работать:
export const app = express();
app.use(express.json());
// 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())
Похоже, что 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.
В случае, если кто-то сталкивается с тем же вопросом, который у меня был; Я использую префикс 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);
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
Если вы используете другой метод, просто установите это поле заголовка, используя любое соглашение.
Вы можете попробовать добавить эту строку кода вверху (после ваших запросов):
app.use(bodyParser.urlencoded({extended: true}));
Что касается причин, почему это работает, ознакомьтесь с документами: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
Добавьте в свой app.js
до вызова роутера
const app = express();
app.use(express.json());
Используйте app.use(bodyparser.json()); перед маршрутизацией. //. app.use("/api", маршруты);
Это случилось со мной сегодня. Ни одно из вышеперечисленных решений не работает для меня. Но маленький поисковик помог мне решить эту проблему. Я кодирую сторонний сервер wechat.
Все становится немного сложнее, если вашему приложению node.js требуется чтение потоковых данных POST, таких как запрос от клиента REST. В этом случае свойство запроса "readable" будет установлено в true, и данные POST должны быть прочитаны в кусках, чтобы собрать весь контент.
Эта проблема может быть связана с тем, что вы не используете анализатор тела (ссылка)
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
Чтобы работать, вам нужно app.use(app.router) после app.use(express.bodyParser()), например:
app.use(express.bodyParser())
.use(express.methodOverride())
.use(app.router);
var bodyParser = require('body-parser');
app.use(bodyParser.json());
Это спасло мой день.
Отработано много времени:
В зависимости от типа содержимого в запросе клиента сервер должен иметь разные значения, один из следующих ниже: 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 работал нормально.
Это также одна из возможностей: Убедитесь, что вы должны написать этот код перед маршрутом в файле app.js (или index.js).
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
Вы можете использовать экспресс-парсер.
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
Я решил это с:
app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});
Последняя версия Express уже имеет встроенный body-parser. Таким образом, вы можете использовать:
const express = require('express);
...
app.use(express.urlencoded({ extended: false }))
.use(express.json());
Если вы отправляете сообщение SOAP, вам нужно использовать сырой парсер:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.raw({ type: 'text/xml' }));
Основываясь на @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());
Кредит @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)
Если вы используете внешний инструмент для выполнения запроса, обязательно добавьте заголовок:
Content-Type: application/json
Для тех, у кого не работал ни один из приведенных выше ответов, я должен был включить cors между своим клиентом и экспрессом.
Вы можете сделать это либо:
Загрузка и включение расширения CORS для вашего браузера, например:
для Chrome,
или
Добавление строк
var cors=require('cors');
app.use(cors());
на вашу экспресс-страницу app.js
(После npm install cors
)
Другой возможный способ получить пустой request.body, когда вы забудете атрибут name из элемента input...
<input type="text" /> /* give back empty request.body -> {}*/
<input type="text" name="username" /> /* give back request.body -> {"username": "your-input"} */
В большинстве случаев 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())