Отправка json для выражения с использованием jQuery

У меня возникла проблема при отправке данных JSON с моего клиента на сервер узла, на котором запущен экспресс.

Вот простой сервер, демонстрирующий мою проблему:

var express = require('express');

var app = express();

app.configure(function(){   
    app.use(express.bodyParser());
    app.use(app.router);
    app.use(express.logger());
});

app.listen(80);

app.post('/', function(req,res){
    console.log(req.body);
    console.log(req.body.number + 1);
});

Этот сервер просто записывает все данные POST в консоль.

Если я вставлю в консоль разработки Chrome следующее: $.post('/', {number:1});

Сервер распечатывает:

{ number: '1' }
11

Как я могу сделать так, чтобы число, которое я передаю, не интерпретировалось как строка? Это как-то связано с промежуточным программным обеспечением bodyParser, которое я использую?

Любая помощь приветствуется !!


person Ed_    schedule 11.05.2013    source источник


Ответы (1)


$.post отправляет данные в кодировке url, поэтому на самом деле отправляется number=1, который затем анализируется так же хорошо, как это может промежуточное программное обеспечение bodyParser.

Чтобы отправить json, вы должны использовать JSON.stringify({number:1}).

Использование $.post, к сожалению, не приведет к установке соответствующего заголовка Content-Type (express все равно обработает его), поэтому лучше использовать:

$.ajax({
    url: '/', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({number:1})}
)
person soulcheck    schedule 11.05.2013
comment
И не забудьте добавить заголовок contentType: 'application / json', иначе в req.body на сервере вообще не будет данных. - person Christiaan Westerbeek; 21.03.2014
comment
@soulcheck, пожалуйста, посмотрите мой вопрос здесь? stackoverflow.com/questions/47085674 / он похож на этот, но мне нужно отправить другое свойство с массивом - person Viet; 03.11.2017
comment
Комментарий Кристиана Вестербика о деньгах. Не путайте json: true с contentType: 'application / json'. Не то же самое. Добавьте contentType: 'application / json', если хотите, чтобы он работал. - person codemonkey; 10.09.2019