Не удается получить тело POST из запроса с помощью Express.js
Я работаю над API с NodeJS и Express (и больше таких вещей, как mongo, сокеты и т.д.), но я застрял на очень простом шаге, я верю, я просто пытаюсь получить информацию из POST req
, но я получаю сообщение об ошибке при попытке доступа к req.body
Вот что у меня есть:
var express = require('express'),
http = require('http'),
path = require('path'),
fs = require('fs'),
io = require('socket.io');
dynroute = require('dynroute');
var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(app.router);
app.use(express.bodyParser());
app.post('/user', function(req, res) {
console.log(JSON.stringify(req.body));
res.send(req.body.self);
});
http.createServer(app).listen(app.get('port'), function ()
{
console.log('App Server is now running at:' + app.get('port'));
});
На console.log(JSON.stringify(req.body));
я получим undefined
, а на res.send(req.body.self);
получаем TypeError: Cannot read property 'self' of undefined
Я искал этот тип ошибок, и обычно проблема заключается в том, что люди не включают в себя app.use(express.bodyParser());
промежуточное программное обеспечение, я также пытался использовать app.use(express.urlencoded());
и app.use(express.json());
, также не работал.
Если я делаю a console.log(req)
, я могу видеть весь объект, но я не вижу body
или любого содержимого, которое я передаю при выполнении запроса POST от клиента (я передаю его как JSON).
* Я знаю, что мог бы использовать restify
или sails.js
для создания API в Node, но я хочу делать все самостоятельно, поэтому я могу извлечь уроки из опыта.
Спасибо
EDIT:
Мне пришлось установить промежуточное ПО bodyparser
перед промежуточным программным обеспечением app.router
, которое исправит его!
Ответы
Ответ 1
Переместите промежуточное ПО bodyParser
над промежуточным программным обеспечением router
!
var app = express();
app.set('port', process.env.PORT || 3999);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(app.router);
Ответ 2
Content-Type = "application/json"
должен быть одним из Request Headers
Ответ 3
BodyParser больше не связан с Express
npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
Ответ 4
Для меня примечание @kevinblanco: "Я должен был установить промежуточное ПО bodyparser перед промежуточным программным обеспечением app.router, чтобы исправить это!" сделал это для меня. Введя его в отдельный ответ, так как он похоронен внизу.
Ваш код должен выглядеть примерно так:
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// My routing here