【问题标题】:Post jQuery JSON Object to NodeJs Restify将 jQuery JSON 对象发布到 NodeJs Restify
【发布时间】:2013-05-31 02:49:01
【问题描述】:

我想知道为什么很难在/:parameter 中发布一个简单的 JSON 字符串来恢复。我遵循了很多例子,但没有找到任何具体的例子。

我在前端有如下代码。

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

【问题讨论】:

    标签: ajax json node.js restify


    【解决方案1】:

    我先回答!

    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"后,node接收到的数据就是真正的json对象类型数据了。

    【讨论】:

      【解决方案2】:

      我终于搞定了。

      --前端代码

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

      【讨论】:

      • 谢谢,'contentType: "application/x-www-form-urlencoded"' 对我也有用。
      【解决方案3】:

      不要把它串起来。试试这个,注意两个变化,我删除了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。

      【讨论】:

      • 我已经尝试过这样的事情。它不起作用。我在帖子中看到了一些奇怪的行为,因为它被这样请求:/OPTIONS/j
      • 也许为时已晚,但如果您仍然不知道,请尝试在您的 ajax 上使用 crossDomain: true 作为选项
      猜你喜欢
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 2017-10-09
      相关资源
      最近更新 更多