it-roy-ru.com

Не могу получить 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());, тоже не сработало.

Если я выполняю функцию console.log(req), я могу видеть весь объект, но не вижу body или любого содержимого, которое я передаю, когда выполняю запрос POST от клиента (я передаю его как JSON).

* Я знаю, что мог бы использовать restify или sails.js для создания API в Node, но я хочу сделать все самостоятельно, чтобы я мог учиться на этом опыте.

Спасибо

Правка:

Мне пришлось поставить промежуточное ПО bodyparser перед промежуточным ПО app.router, чтобы это исправить!

26
kevinblanco

Переместите промежуточное программное обеспечение 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);
31
Renato Gama

Content-Type = "application/json" должен быть одним из Request Headers

8
Akash

BodyParser больше не входит в состав Express

npm install body-parser
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
2
Tobias Artz

Для меня замечание @ 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
1
Ash Blue