2013-04-18 128 views
4

我使用Express 3.0和节点v0.11.0。我有一个提交表单的按钮,我使用ajax将该数据作为JSON对象发布到我的节点服务器。
的客户端代码:错误的请求 - 节点js ajax后

$('#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

谢谢你这个作品。正如古斯塔夫指出的,我需要发送一个强壮的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可能不会向google.comlocalhost:3000以外的任何网站发出AJAX请求)。所以如果你真的想这样做,让你的服务器处理它。

    否则,由于99%的时间,只需使用相对URL(/savedata/)。

  • 此外,还要确保你只发送一个字符串化JSON对象,而不是一个 JSON对象。

    例如'{"test" : 1}'不是{"test" : 1}。所以在你的情况下,字符串化的对象是formData。

我没有试过这个代码与节点服务器上的示例数据,它工作正常。如果你有任何额外的问题,随时问。

我也可以给你的代码,如果你想要它。

+0

感谢队友,现在我意识到我必须发送字符串化的JSON对象。我打算做这个跨域HTTP请求,我正在读取设置dataType为'jsonp'应该做的伎俩。 – Nilath