body-parser чтение данных json post node.js express

Я использую "body-parser": "1.15.0" и "express": "4.13.4" и пытаюсь получить json данные из body части почтового запроса http.

Это мой код:

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

var app = express();
///Set Connection config
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 3000;

//Body parser
app.use(bodyParser.json(({ type: 'application/*+json', 
                            inflate: false
                        })));

app.use(bodyParser.urlencoded({
  extended: true
}));//Read post info

app.use(function(req, res, next) {

   //Response config
   res.charset = 'utf-8'; 
   res.set({
     'Content-Type': 'application/json'
   });

   console.log("body: " + JSON.stringify(req.body));

});

// Routing
require('./routes')(app,io);//define routes

//Connect
server.listen(port, function () {
  console.log('Server listening at port %d', port);
});

Проблема в том, что я получаю req.body как undefined, я сделал несколько поисков и выяснил, что определение parser должно быть перед определением routes. Запрос post должен иметь "Content-Type" : "application/json".

У меня есть это, но я все еще получаю undefined....

Если я использую app.use(bodyParser.text()); и меняю "Content-Type" : "plain/text", все работает нормально, с "Content-Type" : "x-www-form-urlencoded" тоже работает...

Но мне нужно использовать "Content-Type" : "application/json" кто-нибудь может мне помочь?

Заранее спасибо.

РЕДАКТИРОВАТЬ: данные отправляются с target-c

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval:60.0];
[request setHTTPMethod:method];
[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

NSDictionary* sendInfo = [[NSDictionary alloc]initWithObjectsAndKeys:
                              @"test", @"user" , nil];

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:sendInfo options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonDataString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSData *requestData = [jsonDataString dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody: requestData];

//Capturing server response
NSError* error;
NSHTTPURLResponse* response;
NSData* result = [NSURLConnection sendSynchronousRequest:request  returningResponse:&response error:&error];

person Jordan    schedule 04.03.2016    source источник
comment
как вы отправляете json на сервер?   -  person Zeeshan Hassan Memon    schedule 04.03.2016
comment
привет, я отправляю сообщение из приложения ios и использую клиент Advanced REST (плагин Chrome) для тестирования, но получаю тот же результат... я проверил отправляемые заголовки, и они имеют правильный тип контента   -  person Jordan    schedule 04.03.2016
comment
посмотрите мой ответ и попробуйте, я ответил, предполагая, что ваш клиент будет отправлять чистый json, если это так, он должен работать   -  person Zeeshan Hassan Memon    schedule 04.03.2016


Ответы (2)


Попробуйте заменить следующую строку в вашем коде:

app.use(bodyParser.json(({ type: 'application/*+json', 
                            inflate: false
                        })));

Со следующим:

app.use(bodyParser.json());
person Zeeshan Hassan Memon    schedule 04.03.2016
comment
С этим изменением я получаю неверный доступ с ошибкой 400 (SyntaxError: Unexpected token) json, который я отправляю, это {user: teste} - person Jordan; 04.03.2016

хорошо, найдите проблему... но я не могу объяснить, почему это происходит. Чтобы начать читать тела json, мне пришлось изменить метод:

app.use(function(req, res, next)

для этого:

app.use('/', bodyParser.json(), function(req, res, next)

И все начало работать

person Jordan    schedule 21.03.2016
comment
не могли бы вы помочь мне с этим, пожалуйста? : stackoverflow.com/questions/41167585/ - person codeinprogress; 19.12.2016