2013-06-04 17 views
5

/:parameterに簡単なJSON文字列を投稿して復元することがなぜ難しいのかを知りたいのですが、私は多くの例を追ってきましたが、具体的なものは何も見つかりませんでしたjQuery JSONオブジェクトをNodeJsに返信する

私はフロントエンドに次のコードを書いています。

$("#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/後のparamを連結場合、私は単純なテキストを送信で成功しています。しかし、私が送ろうとしているものは、このようなオブジェクトです。{hello:"world"}そしてそれをnodeJSに再構築し、それを使って作業してください。

--edit:

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

答えて

6

私はついにそれを働かせました。

--Front終了コード

$("#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) 
+0

ありがとう、 'contentType: "application/x-www-form-urlencoded "は私のために働いたものです。 –

0

文字化しないでください。これを試してみて、2つの変更をメモして、私はJSON.stringifyを削除し、application/jsonに、JavaScriptではなくJSONとして切り替えました。

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

application/javascriptは、JSONPを実行するときにのみ使用してください。

+0

私はすでにこれを試していました。それは仕事をしません。 /OPTIONS/j – Oxnigarth

+0

あまりにも遅いかもしれませんが、まだcrossDomainを使ってみると分かりません:あなたのAjaxのオプションとしてtrueを入力してください – albertpeiro

0

私の答えを最初に!

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のデータはサーバ側に送るものだけで、そのデータ型は定義されていないので、JSON.stringify({key:value})を使用すると、データは '{key: "xxx"}'のような文字列として送信されます。 jsonオブジェクトではなく、文字列構造体でもjsonのように見えます。しかし、$ .ajaxにcontentType: "application/json"を追加した後、ノードがデータを受け取ると、実際のjsonオブジェクトタイプのデータになります。

関連する問題