Данные массива POST для Express анализируются как JSON - PullRequest
7 голосов
/ 08 мая 2011

Мое приложение - Node.js, использующее Express.

Отправка этих тестовых данных из моего клиента с помощью jQuery POST:

{
title: 'hello',
notes: [
{title: 'note 1'},
{title: 'note 2'}
]

}

И это результат в моем коде сервера:

{ title: 'hello', notes: { '0': { title: 'note 1' }, '1': { title: 'note 2' } } }

Я хочу получить массив заметок для вставки в мою БД в виде массива. Чего мне не хватает?


Так как я не могу добавить ответ сам в течение 8 часов (wtf?), НО на самом деле это не отвечает, почему Express.bodyParser не анализирует JSON правильно

Хорошо, я могу заставить его работать, используя:

JSON.stringify ( data )

на клиенте, затем на стороне сервера, используя

JSON.parse( req.rawBody )

Это не правильно, и почему Express.bodyParser неправильно анализирует JSON ?!

Ответы [ 4 ]

17 голосов
/ 09 июля 2012

На вашем клиенте:

$.ajax({
  type: 'POST',
  data: JSON.stringify(data),
  contentType: 'application/json',
  url: '/endpoint'
});

На вашем сервере:

console.log('POST: ',req.body);

Проблема в том, что jQuery копирует ваши данные перед отправкой. Если вы установите правильный тип MIME, то он освободит вас.

2 голосов
/ 28 мая 2011

Можете ли вы опубликовать свой код jQuery на стороне клиента, пожалуйста? По умолчанию jQuery будет отправлять данные в формате urlencoded, а не в формате JSON. См. ответ на этот вопрос , чтобы узнать, как jQuery отправляет реальные данные JSON.

FYI связующее ПО для экспресс-подключения bodyParser просто использует JSON.parse для анализа JSON (и qs.parse для анализа urlencoded данных). Я не думаю, что в этом коде есть какие-то явные ошибки. Поэтому я думаю, что вам следует дважды проверить данные, которые вы отправляете из браузера.

1 голос
/ 16 апреля 2012

Я наткнулся на этот старый вопрос, когда искал какие-то другие вещи для nodejs.

Это распространенное заблуждение, что jQuery.ajax() функции отправляют данные с использованием JSON.Данные отправляются с помощью jQuery как данные POST, а не как строка JSON.Таким образом, все типы данных (включая числа в вашем массиве) отправляются в виде строк.

Это означает, что express анализирует ключи 'массива' как строку, и поскольку массив не может иметь строковый ключ вJavaScript не будучи объектом, он приводится к объекту.

0 голосов
/ 08 мая 2011

Все это имеет смысл тогда;вы можете использовать Express.bodyParser, чтобы получить такой результат, или вы можете использовать JSON.parse или даже eval('(' + myPostedData + ')'), чтобы получить объект результата без индексов.

При текущей настройке все, что вам нужно сделать, это:

for(var j = 0; j < myVariable.notes.length; j++)
{
    var currentNode = myVariable.notes[j];

    //currentode.title should be 'note 1' for j = 0, etc
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...