2016-06-07 74 views
-1

我是Node.js的新手,我创建了一个方法,它应该通过ajax异步获取jsonp数据并在图中显示检索到的内容。无法创建并传递jsonp数据

function loadChart(destElementId, alertId) { 
     $.ajax({ 
      url:'http://localhost:3000/products/data/productsData.js', 
      type: "GET", 
      data: {prodId: prodId}, 
      jsonp: true, 
      dataType : 'json', 
      jsonpCallback: "jsonpCallback" 
     }); 

    window["jsonpCallback"] = function(data) { 

     populateData(data, destId); 
    } 
} 

在正常应用,我想通过通过外部Web服务获取真实的数据:当包含URL指向一个静态的js文件(在这种情况下productsData.js)JSONP数据,此方法效果很好。我创建了以下js文件(data-client.js),用于从特定Web服务中检索数据。当呼叫是基于浏览器的时候,数据会像普通的json一样成功读取,并在浏览器中显示。

var express = require('express'); 
var router = express.Router(); 
var http = require('http'); 
var yaml_config = require('node-yaml-config'); 
var config = yaml_config.load(__dirname + '/../config/app-config.yml'); 


router.get('/data/:id', function (req, res, next) { 
var opts = { 
    host: config.alertService.host, 
    port: config.alertService.port, 
    method: 'GET', 
    path: '/DataService/rest/receiveData/' + req.params.id 
} 

var reqGet = http.request(opts, function (dataResponse) { 
    var responseString = ''; 
    dataResponse.on('data', function (data) { 
     responseString += data; 
    }); 
    var response = {x:[],y:[],z:[],t:[]}; 
    dataResponse.on('end', function() { 
     var responseObject = JSON.parse(responseString); 
     var accs = responseObject.data.listPCS; 
     for(var i in accs){ 
      response.x.push(accs[i].accX); 
      response.z.push(accs[i].accY); 
      response.y.push(accs[i].accZ); 
      response.t.push(accs[i].timestamp); 
     } 
     res.json(response); 
    }); 
}); 
reqGet.end(); 
reqGet.on('error', function (e) { 
    console.error(e); 
}); 

}); 

module.exports = router; 

用于使用实时数据JSONP的第一步是,以取代先前的URL值:

url: 'http://localhost:3000/products/data/'+productId, 

第二步骤是在数据client.js取代:

res.json(response); 

附:

res.jsonp('jsonpCallback('+ JSON.stringify(response) + ');'); 

不知何故数据不会被提取。当我试着通过浏览器获得的数据(即通过进入http://localhost:3000/data/ID937),但是我得到以下结果:

"jsonpCallback({\"x\":[1,1,1],\"y\":[2,1,4],\"z\":[0,0,9],\"t\":[1462790772000,1462790772010,1462790772020]});" 

是否有人可以告诉我在哪里的问题可能是什么?我会非常感谢。

回答

2

看起来您正在使用Express。

jsonp()预计会传递您的原始数据,而不是包含完整响应的字符串。它还希望从查询字符串中读取回调名称,如果您愿意,jQuery将为您生成该回调名称。

所以,我们要做的第一件事情是这样它传递回调名称正确

在客户端解决您的客户端代码

$.ajax({ 
    url: 'http://localhost:3000/products/data/' + productId, 
    dataType: 'jsonp', 
}).done(function(data) { 
    populateData(data, destId); 
}); 

在这里的变化是:

  • GET是默认的(对于JSONP,只有选项),所以不需要指定type
  • 您将数据作为URL路径部分传递,而不是查询字符串。删除您未使用的data属性。
  • jsonp属性用于覆盖回调名称。这是有害的,不要这样做(同样,不要指定jsonpCallback)。 jQuery将为您生成一个并将其添加到查询字符串中。
  • 如果您在处理JSONP,那么指定作为数据类型,而不是JSON。
  • 请勿手动创建您自己的全局。将你的函数传递给done,让jQuery使它成为一个全局的函数(使用生成的名称来匹配回调函数)。

在服务器

只是通过您要发送回jsonp()的数据结构。

res.jsonp(response); 

Express将从查询字符串中读取回调名称。

+0

昆汀,非常感谢! – Anto