将jQuery JSON对象发布到NodeJs Restify

我想知道为什么很难发布一个简单的JSONstring在/:parameter来restify。 我跟着很多例子,但没有find具体的东西。

我在前端有以下代码。

 $("#btnDoTest").click(function() { var jData = { hello: "world" }; var request = $.ajax({ url: "http://localhost:8081/j/", async: false, type: "POST", data: JSON.stringify(jData), contentType: "application/javascript", dataType: "json" }); request.success(function(result) { console.log(result); }); request.fail(function(jqXHR, textStatus) { alert("Request failed: " + textStatus); }); }); 

如果我连接j/后的参数,我发送简单的文本是成功的。 但是我想发送的是一个像这样的对象{hello:"world"}并将其重构到nodeJS中并使用它。

– 编辑:

 This is my nodejs file /* the below function is from restifylib/response.js */ var restify = require("restify"); /* create the restify server */ var server = restify.createServer({ }); server.use(restify.bodyParser({ mapParams: true })); server.use( function crossOrigin(req,res,next){ res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); return next(); } ); server.post('/j/', function (req, res, next) { //res.send(201,"REceived body: "+JSON.stringify(req.params)); res.send(201,"REceived body: "+JSON.stringify(req.params)); return next(); }); var port = 8081; server.listen(port); console.log("Server listening on port " +port) 

任何帮助,将不胜感激。

0X

我终于搞定了。

– 前端代码

 $("#btnDoTest").click(function() { var request = $.ajax({ url: "http://localhost:3000/j", async: false, type: "POST", data: { blob: {wob:"1",job:"2", ar:[1,2,{a:'b'}]} }, contentType: "application/x-www-form-urlencoded", //This is what made the difference. dataType: "json", }); request.success(function(result) { console.log(result); }); request.fail(function(jqXHR, textStatus) { alert("Request failed: " + textStatus); }); }); 

NodeJs服务

 /* the below function is from restifylib/response.js */ var restify = require("restify"); /* create the restify server */ var server = restify.createServer({ }); server.use(restify.bodyParser()); server.use(restify.CORS()); server.post('/j/', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); // req.params == data on jquery ajax request. res.send(200, JSON.stringify(req.params)); console.log(req.params.blob.ar[2].a) res.end(); return next(); }); var port = 3000; server.listen(port); console.log("Server listening on port " + port) 

不要把它串起来。 试试这个,注意两个变化,我删除了JSON.stringify并切换到application/json ,作为它的JSON而不是JavaScript。

 var request = $.ajax({ url: "http://localhost:8081/j/", async: false, type: "POST", data: jData, contentType: "application/json", dataType: "json" }); 

application/javascript应该只在使用JSONP时使用。

我的答案第一!

jQuery的:

 $.ajax({ url: url, method: 'post', data: JSON.stringify({key:value}), contentType: "application/json" }); 

节点http:

 server.post('/1', function(req, res) { var body = req.body; var dataValue = body.dataKey; }); 

为什么?

$ .ajax的数据只是发送给服务器端的数据,它的数据types没有定义,所以当使用JSON.stringify({key:value}) ,数据会以'{key: xxx“}”,节点收到一个string,而不是一个JSON对象,即使string结构看起来像一个JSON。 但在我们在$ .ajax中添加contentType: "application/json"后,当节点接收到数据时,它将是一个真正的json对象types的数据。