2014-12-05 58 views
1

我在解析序列化的JSON Ajax获取请求时发生问题(使用jQuery $ .ajax)发送到我的express.js 4服务器。作为JSON请求发送的数据由数据表生成。express.js 4来自GET请求的JSON解析问题(来自数据表的请求数据)

这里是我开始对客户端

$(document).ready(function() { 
    $('#example').dataTable({ 
     "bServerSide": true, 
     "fnServerData": function (sSource, aoData, fnCallback) { 
      $.ajax({ 
       "dataType": 'json', 
       contentType: 'application/json', 
       "type": "GET", 
       "url": "http://localhost:3000/ajax/phenotypes/withOrg/like/datatables/", 
       "data": aoData, 
       "success": fnCallback, 
       "error": function() { 
        alert('have some problem'); 
       } 
      }); 
     }     
    }); 
}); 

当我在布劳尔数据表加载此代码生成以下GET请求URL(到服务器):

GET /ajax /表型/ withOrg/like/datatables /?draw = 1 & columns =%5Bobject + Object%5D%2C%5Bobject + Object%5D%2C%5Bobject + Object%5D%2C%5Bobject + Object%5D%2C %5Bobject + Object%5D%2C%5Bobject + Object%5D & order =%5Bobject + Object%5D &开始= 0 &长度= 10 &搜索=%5Bobject +对象%5D

或以解码形式(从萤火虫输出)

columns [object Object],[object Object],[object Object],[object Object],[object Object],[object Object] 
    draw 1 
    length 10 
    order [object Object] 
    search [object Object] 
    start 0 

所以我发送

$(document).ready(function() { 
      $('#example').dataTable({ 
       "bServerSide": true, 
       "fnServerData": function (sSource, aoData, fnCallback) { 
        var myData = JSON.stringify(aoData); 
        $.ajax({ 
         "dataType": 'json', 
         contentType: 'application/json', 
         "type": "GET", 
         "url": "http://localhost:3000/ajax/phenotypes/withOrg/like/datatables/", 
         "data": myData, 
         "success": fnCallback, 
         "error": function() { 
          alert('have some problem'); 
         } 
        }); 
       }     
      }); 
     }); 
前序列化的数据

这里是从数据表生成的GET参数:

GET /ajax/phenotypes/withOrg/like/datatables /?[{%22name%22:%22draw%22,%22value%22:1},{%22name%22:%22columns%22,%22value% 22:[{%22data%22:0,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:%22%22 ,%22regex%22:假}},{%22data%22:1,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value %22:%22%22%22regex%22:假}},{%22data%22:2,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,% 22search%22:{%22value%22:%22%22%22regex%22:假}},{%22data%22:3,%22name%22:%22%22%22searchable%22:真,% 22orderable%22:真,%22search%22:{%22value%22:%22%22%22regex%22:假}},{%22data%22:4,%22name%22:%22%22% 22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:%22%22%22regex%22:假}},{%22data%22:5,%22name%22 :%22%22%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:%22%22%22regex%22:假}}]},{%22name %22:%22order%22%22value%22:[ {%22column%22:0,%22dir%22:%22asc%22}]},{%22name%22:%22start%22%22value%22:0},{%22name%22:%22length%22 ,%22value%22:10},{%22name%22:%22search%22,%22value%22:{%22value%22:%22%22,%22regex%22:false}}] HTTP/1.1

解码形式

(从萤火输出,并采用免工具用的JSLint检查在线美化,似乎是正确的!)

[ 
    { 
     "name":"draw", 
     "value":1 
    }, 
    { 
     "name":"columns", 
     "value":[ 
     { 
      "data":0, 
      "name":"", 
      "searchable":true, 
      "orderable":true, 
      "search":{ 
       "value":"", 
       "regex":false 
      } 
     }, 
     { 
      "data":1, 
      "name":"", 
      "searchable":true, 
      "orderable":true, 
      "search":{ 
       "value":"", 
       "regex":false 
      } 
     }, 
     { 
      "data":2, 
      "name":"", 
      "searchable":true, 
      "orderable":true, 
      "search":{ 
       "value":"", 
       "regex":false 
      } 
     }, 
     { 
      "data":3, 
      "name":"", 
      "searchable":true, 
      "orderable":true, 
      "search":{ 
       "value":"", 
       "regex":false 
      } 
     }, 
     { 
      "data":4, 
      "name":"", 
      "searchable":true, 
      "orderable":true, 
      "search":{ 
       "value":"", 
       "regex":false 
      } 
     }, 
     { 
      "data":5, 
      "name":"", 
      "searchable":true, 
      "orderable":true, 
      "search":{ 
       "value":"", 
       "regex":false 
      } 
     } 
     ] 
    }, 
    { 
     "name":"order", 
     "value":[ 
     { 
      "column":0, 
      "dir":"asc" 
     } 
     ] 
    }, 
    { 
     "name":"start", 
     "value":0 
    }, 
    { 
     "name":"length", 
     "value":10 
    }, 
    { 
     "name":"search", 
     "value":{ 
     "value":"", 
     "regex":false 
     } 
    } 
] 

现在的问题,这个字符串化的URL不能在快递4被解析为服务器端 我对此使用express4 req.query和url.parse方法:http://expressjs.com/api.html#req.query 然后尝试解析接收JSON字符串与JSON.parse()来法

... 
var url = require('url'); 
... 

router.get('/withOrg/like/datatables/', function (req, res) { 
    console.log('getting json string via req.query'); 
    console.log(req.query); 
    console.log('output parsed json object using JSON.parse'); 
    console.log(JSON.parse(req.query)); 

    //another try 
    console.log('for stack overflows test 2'); 
    console.log(url.parse(req.url, true).query); 
    console.log('output parsed json object using JSON.parse'); 
    console.log(url.parse(req.url, true).query); 
}) 

两个JSON字符串输出的结果是,你可以在这里看到和无法与JSON解析无效JSON。解析:

getting json string via req.query 

{ “{ “数据”:0, “名”: “”, “搜索”:真实的, “订购”:真实的, “搜索”:{ “值”:” “ ”正则表达式“:假}},{ ”数据“:1, ”名“: ”“, ”搜索“:真实的, ”订购“:真实的, ”搜索“:{ ”值“: ”“,” 正则表达式“:假}},{” 数据 “:2,” 名 “:””, “搜索”:真实的, “订购”:真实的, “搜索”:{ “值”: “”, “正则表达式”:假} },{ “数据”:3, “名”: “”, “搜索”:真实的, “订购”:真实的, “搜索”:{ “值”: “”, “正则表达式”:假}},{”数据 “:4,” 姓名 “:””, “搜索”:真 “订购”:真, “搜索”:{ “值”: “”, “正则表达式”:假}},{ “数据”:5 ,“name”:“”,“searchable”:true,“orderable”:true,“search”:{“value”:“”,“regex”:false}}': {'{“column”:0 ,“dir”:“asc”}':''}}

output parsed json object using JSON.parse 

getting json string via req.query 

{ “{ “数据”:0, “姓名”: “”, “搜索”:真 “订购”:真, “搜索”:{ “值”: “”, “正则表达式”:假}},{ “数据”:1, “名”: “”, “搜索”:真实的, “订购”:真实的, “搜索”:{ “值”: “”, “正则表达式”:假}},{ “数据”:2, “名”: “”, “搜索”:真实的, “订购”:真实的, “搜索”:{ “值”: “”, “正则表达式”:假}}, { “数据”:3, “名”: “”, “搜索”:真实的, “订购”:真实的, “搜索”:{ “值”: “”, “正则表达式”:假}},{ “数据” :4中, “名称”: “”, “搜索”:真 “订购”:真, “搜索”:{ “值”: “”, “正则表达式”:假}},{ “数据”:5“, name“:”“,”searchable“:true,”orderable“:true,”search“:{”value“:”“,”regex“:false}}':'{”column“:0, dir“:”asc“}':''}}

output parsed json object using JSON.parse 

当我试图解析JSON字符串,我从JSON.parse

SyntaxError: Unexpected token o 
    at Object.parse (native) 
    at module.exports (/Users/xxx/yyy/routes/phenotypesAJAX.js:16:19) 
    at Layer.handle [as handle_request] (/Users/xxx/yyy/node_modules/express/lib/router/layer.js:82:5) 
    at next (/Users/xxx/yyy/node_modules/express/lib/router/route.js:100:13) 

得到错误这是快递4的错误吗? 我看不出问题在哪里。在客户端,序列化的数据表GET请求似乎有效(用JSLint检查)。在express4服务器端,我找不到任何其他方式以不同的方式解析GET请求。

非常感谢你的帮助, 奥利弗

回答

0

我已经从快递github上的错误追踪系统发布这一问题得到了答案。 获得的经验教训: 我在想复杂,express.js请求方法不是特别为特定的请求格式编写的!他们只是使用发送给他们的数据格式而无需修改!

我第一次使用的方法:

req.query 

[..]只适用于标准的查询字符串,这是key = value对, 您提供的网址不[..]

正确的方法来解决我的问题是:

url.parse(req.url).query 

返回一个比必须手动解码的URL的完整参数字符串:

obj = JSON.parse(decodeURIComponent(query)) 

以下是完整的解释: https://github.com/strongloop/express/issues/2460