У меня это как конфигурация моего сервера 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());
но, как вы можете видеть, я называю это перед маршрутами.
Любая подсказка?
Последние версии Express (4.x) отделили промежуточное программное обеспечение от базовой платформы. Если вам нужен парсер тела, вам нужно установить его отдельно
а затем сделайте это в своем коде
источник
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json())
спас меня !!Вы должны использовать
app.use(express.bodyParser())
раньшеapp.use(app.router)
. На самом деле,app.use(app.router)
должно быть последнее, что вы называете.источник
app.use(app.router)
по.use
вызовам не решает проблему :(.app.use(require('connect').bodyParser());
вместоapp.use(express.bodyParser());
.var router=express.Router()
;Сначала убедитесь, что вы установили модуль npm с именем body-parser, вызвав:
Затем убедитесь, что вы включили следующие строки перед вызовом маршрутов
источник
Express 4, имеет встроенный парсер тела. Не нужно устанавливать отдельный body-parser. Так что ниже будет работать:
источник
Content-Type в заголовке запроса действительно важен, особенно когда вы публикуете данные из curl или любых других инструментов.
Убедитесь, что вы используете что-то вроде application / x-www-form-urlencoded, application / json или других, это зависит от ваших почтовых данных. Оставьте это поле пустым, чтобы запутать Express.
источник
Как уже написано под одним комментарием, я решил это с помощью
вместо того
Я до сих пор не знаю, почему простое
express.bodyParser()
не работает ...источник
connect
модуль черезnpm install connect
и повторить попытку. Это единственное, о чем я могу подумать, прочитав вывод вашей ошибки.Content-Type
заголовокapplication/json
.Content-Type
заголовка,application/json
когда я выполнял свой запрос.application/json
vstext/json
в запросе работает, как предложено @GrantEagon.источник
Добавьте в свой
app.js
до вызова роутера
источник
Похоже, что парсер тела больше не поставляется с экспресс. Возможно, нам придется установить его отдельно.
Обратитесь к странице git https://github.com/expressjs/body-parser для получения дополнительной информации и примеров.
источник
На случай, если кто-нибудь столкнется с той же проблемой, что и я; Я использую префикс URL, как
который был настроен с маршрутизатором
и тогда у меня было следующее
Что решило мою проблему, поместив конфигурацию bodyparser выше
app.use('/api', router);
окончательный
источник
express.bodyParser () нужно сообщить, какой тип контента он анализирует. Поэтому вам необходимо убедиться, что при выполнении запроса POST вы включаете заголовок «Content-Type». В противном случае bodyParser может не знать, что делать с телом вашего запроса POST.
Если вы используете curl для выполнения запроса POST, содержащего некоторый объект JSON в теле, это будет выглядеть примерно так:
Если вы используете другой метод, просто установите это поле заголовка, используя любое соглашение.
источник
Используйте app.use (bodyparser.json ()); до маршрутизации. // app.use ("/ api", маршруты);
источник
Вы можете попробовать добавить эту строку кода вверху (после ваших требований require):
Что касается причин, почему это работает, ознакомьтесь с документами: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
источник
Большую часть времени req.body не определен из-за отсутствия парсера JSON
может отсутствовать для парсера тела
а иногда это не определено из-за происхождения кросса, поэтому добавьте их
источник
Это произошло со мной сегодня. Ни одно из вышеперечисленных решений не работает для меня. Но небольшое прибегание к помощи помогло мне решить эту проблему. Я пишу для wechat стороннего сервера.
Все становится немного сложнее, когда вашему приложению node.js требуется чтение потоковых данных POST, например, запрос от клиента REST. В этом случае для свойства запроса «readable» будет задано значение true, а данные POST должны читаться порциями, чтобы собрать весь контент.
http://www.primaryobjects.com/CMS/Article144
источник
Потрачено много времени:
В зависимости от Content-Type в вашем клиентском запросе сервер должен иметь разные, один из ниже app.use ():
Источник: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Пример:
Для меня, на стороне клиента, у меня был ниже заголовок:
Итак, на стороне сервера я использовал:
Затем требовалось, чтобы все работало нормально.
источник
в Express 4 это действительно просто
источник
Для работы вам нужно app.use (app.router) после app.use (express.bodyParser ()) , вот так:
источник
app.use
наapp.router
перед тем,express.bodyParser
но ваш код явно указывает на то, что это после того, как . Так что это?Это спасло мой день.
источник
Эта проблема может быть из-за того, что вы не используете body-parser ( ссылка )
источник
Я решил это с:
источник
Это также одна из возможностей : Убедитесь, что вы должны написать этот код перед маршрутом в файле app.js (или index.js).
источник
Вы можете использовать экспресс парсер тела.
источник
Последняя версия Express уже имеет встроенный body-parser. Таким образом, вы можете использовать:
источник
В случае, если вы публикуете SOAP-сообщение, вам нужно использовать raw body parser:
источник
Опираясь на @ kevin-xue, тип контента должен быть объявлен. В моем случае это происходило только с IE9, потому что XDomainRequest не устанавливает тип контента , поэтому bodyparser и expressjs игнорировали тело запроса.
Я справился с этим, установив явно тип содержимого перед передачей запроса в анализатор тела, например так:
источник
Кредит @spikeyang за большой ответ (приводится ниже). Прочитав предложенную статью, приложенную к сообщению, я решил поделиться своим решением.
Когда использовать?
Решение потребовало, чтобы вы использовали экспресс-маршрутизатор, чтобы насладиться им. Итак: Если вы пытались использовать принятый ответ безуспешно, просто используйте функцию копирования и вставки:
и назовите это как:
ПРИМЕЧАНИЕ: для больших полезных нагрузок - используйте буфер массива ( больше @ MDN )
источник
Если вы используете какой-либо внешний инструмент для выполнения запроса, обязательно добавьте заголовок:
Content-Type: application/json
источник
Для тех, у кого не работает ни один из приведенных выше ответов, я должен был включить cors между своим клиентом и экспрессом.
Вы можете сделать это либо:
Загрузка и включение расширения CORS для вашего браузера, например:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en
для Chrome,
или
Добавление строк
на вашу экспресс-
app.js
страницу. (Послеnpm install cors
)источник