2013-04-18 4 views
4

Я использую express 3.0 и node v0.11.0. У меня есть кнопка, которая отправляет форму, и я использую ajax для отправки этих данных в качестве объекта JSON на мой сервер узлов.
код клиента:Плохой запрос - узел js ajax post

$('#contact').submit(function(e) { 
console.log('submit called'); 
var formData = JSON.stringify($('form').serializeObject()); 
console.log(formData); 

$.ajax({ 
    url: "http://localhost:3000/savedata/", 
    type: "POST", 
    dataType: 'json', 
    data: {objectData: formData}, 
    contentType: "application/json", 
    complete: function() { 
     console.log('process complete'); 
    }, 
    success: function(data) { 
     console.log('process sucess'); 
    }, 
    error: function() { 
     console.log('process error'); 
    }, 
    }); 
return false; 
}); 

Тогда на моем сервере:

var express = require('express'); 
var app = express(); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.static(__dirname + '/public', {maxAge: 86400000})); 
app.engine('.jade', require('jade').__express); 

app.post('/savedata', function(req, res) { 
    console.log('savedata called'); 
    console.log(req.body); 
    //var resultObject = JSON.parse(req.body.objectData); 
    //console.log(resultObject); 
    res.end(); 
}); 

Проблема, с которой я столкнулся в том, что, когда я использую express.bodyParser() промежуточное программное обеспечение, я получаю:

Error: Bad Request 
at next (/home/captain/data/lemontreecakes/node_modules/express/node_modules/connect/lib/proto.js:125:13) 
at /home/captain/data/lemontreecakes/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:54:23 
at IncomingMessage.<anonymous> (/home/captain/data/lemontreecakes/node_modules/express/node_modules/connect/lib/middleware/json.js:74:60) 
at IncomingMessage.EventEmitter.emit (events.js:92:17) 
at _stream_readable.js:883:14 
at process._tickCallback (node.js:415:13) 

Это выход консоли в браузере:

submit called load.js:33 
{"name":"tes","email":"[email protected]"} load.js:36 
POST http://localhost:3000/savedata/ 400 (Bad Request) jquery-1.9.1.min.js:5 
process error load.js:54 
process complete 

Так что я знаю, что я отправляю данные на свой сервер. Если удалить тело синтаксический анализатор среднего изделия с сервера узла, то я получаю

savedata called 
TypeError: Cannot read property 'objectData' of undefined 

Я думаю, что я не отсылают данные в формате JSON должным образом на сервер. Любые подсказки будут оценены.

+0

Не используйте 'JSON.stringify' данные формы, но передавайте данные в виде сериализованной формы как параметр data. – CBroe

ответ

2

Я не совсем уверен, если это решает проблему, но попробуйте это:

$.ajax({ 
    ... 
    data: JSON.stringify({ "objectData": formData}), 
    ... 
+0

Спасибо, что это работает. Как указал Густав, мне нужно было отправить на сервер strngified объект JSON, и поскольку мой сервер выполняет JSON.parse (req.body.objectData), мне нужно отправить objectData. – Nilath

2

Попробуйте этот код вместо:

$.ajax({ 
     url: "/savedata/", 
     type: "POST", 
     data: formData, 
     contentType: "application/json", 
     success: function(data) { 
      alert('success'); 
     }, 
     error: function() { 
      alert('error'); 
     } 
    } 
); 
  • Прежде всего, браузер на основе AJAX может не выполнять междоменный HTTP-запрос (например, ваш сайт localhost:3000 может не выполнять запрос AJAX до google.com или любого другого сайта, кроме localhost:3000). Поэтому, если вы действительно этого хотите, пусть ваш сервер справится с этим.

    В противном случае, в 99% случаев, используйте только относительный URL (/savedata/).

  • Кроме того, убедитесь, что вы только отправить строковой JSON объект и не JSON объект.

    Например, '{"test" : 1}' и не{"test" : 1}. Таким образом, в вашем случае строковый объект является formData.

Я пробовал этот код с примерами данных на сервере узлов, и он работал нормально. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.

Я также могу дать вам код, если вы этого хотите.

+0

Спасибо, я понимаю, что мне нужно отправить стробированный объект JSON. Я планирую сделать междоменный HTTP-запрос с этим, я читал, что настройка dataType на «jsonp» должна делать трюк. – Nilath

Смежные вопросы