首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >d3.js queue.js和node.js

d3.js queue.js和node.js
EN

Stack Overflow用户
提问于 2015-11-19 22:40:08
回答 2查看 1K关注 0票数 2

在将数据传递给高速公路以在浏览器中呈现d3图表之前,我试图在nodejs中加载数据。

我知道我可以以这种方式加载数据- https://github.com/mbostock/queue

我有一个像这样的高速公路路线-

代码语言:javascript
复制
    var d3 = require('d3')
            ,queue = require("queue-async")
            ;

        router.get('/', handler1);

        function handler1(req, res) {

    queue()
       .defer(d3.json, 'https://data.medicare.gov/resource/a8s4-5eya.json?$limit=50000&$$app_token=igGS35vW9GvDMmJUnmHju2MEH&$select=org_pac_id%20as%20source, org_pac_id%20as%20target,org_lgl_nm%20as%20description')
       .defer(d3.json, 'https://data.medicare.gov/resource/a8s4-5eya.json?$limit=50000&$$app_token=igGS35vW9GvDMmJUnmHju2MEH&$select=org_pac_id%20as%20source, org_pac_id||pri_spec%20as%20target, pri_spec%20as%20description')
       .defer(d3.json, 'https://data.medicare.gov/resource/a8s4-5eya.json?$limit=50000&$$app_token=igGS35vW9GvDMmJUnmHju2MEH&$select=org_pac_id||pri_spec%20as%20tsource, pri_spec%20as%20target, frst_nm%20as%20description')
       .await(go);

    function go(error, data,d2,d3){

     data.concat(d2); data.concat(d3);

     console.log(data);

     res.render('index', { title: 'Group Practices', data });

    }  
  }
module.exports = router;

但我发现浏览器出错了,

代码语言:javascript
复制
XMLHttpRequest is not defined

ReferenceError: XMLHttpRequest is not defined
    at d3_xhr (/Users/Admin/Public/GroupPractice/node_modules/d3/d3.js:1934:114)
    at d3.json (/Users/Admin/Public/GroupPractice/node_modules/d3/d3.js:9533:12)
    at pop (/Users/Admin/Public/GroupPractice/node_modules/queue-async/queue.js:24:14)
    at Object.q.defer (/Users/Admin/Public/GroupPractice/node_modules/queue-async/queue.js:55:11)
    at handler1 (/Users/Admin/Public/GroupPractice/routes/index.js:18:5)
    at Layer.handle [as handle_request] (/Users/Admin/Public/GroupPractice/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/Admin/Public/GroupPractice/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/Users/Admin/Public/GroupPractice/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/Admin/Public/GroupPractice/node_modules/express/lib/router/layer.js:95:5)
    at /Users/Admin/Public/GroupPractice/node_modules/express/lib/router/index.js:277:22

如何使用d3和队列预加载RESTful数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-20 09:11:24

d3库是一个客户端库.这意味着它必须在浏览器中使用,而不是在服务器端应用程序中使用。

如果您想在您的Express应用程序中获取数据并将它们连接起来,您可以使用异步request,如下所述:

代码语言:javascript
复制
var request = require('request');
var async = require('async');

function createRequestTask(url) {
  return function(callback) {
    request({
      url: url,
      json: true        
    }, function (err, response, body) {
      callback(err, body);
    });
  };
}

async.parallel([
  // URL #1
  createRequestTask('https://data.medicare.gov/resource/a8s4-5eya.json?$limit=50000&$$app_token=igGS35vW9GvDMmJUnmHju2MEH&$select=org_pac_id%20as%20source, org_pac_id%20as%20target,org_lgl_nm%20as%20description'),
  // URL #2
  createRequestTask('https://data.medicare.gov/resource/a8s4-5eya.json?$limit=50000&$$app_token=igGS35vW9GvDMmJUnmHju2MEH&$select=org_pac_id%20as%20source, org_pac_id%20as%20target,org_lgl_nm%20as%20description'),
  (...)
],
function(err, results) {
  // Result contains an array with each request result
});

请求将并行执行,当所有请求完成后,将调用最终回调。results变量将包含一个包含所有响应内容的数组。

然后,您可以利用这个数组构建要返回的Express路由返回的对象。

下面是您的代码的更新:

代码语言:javascript
复制
router.get('/', handler1);

function handler1(req, res) {
  async.parallel([
    // URL #1
    createRequestTask('https://data.medicare.gov/...'),
    // URL #2
    createRequestTask('https://data.medicare.gov/...'),
    (...)
  ],
  function(err, results) {
    res.render('index', { title: 'Group Practices', results });
  });  
}

module.exports = router;

希望它能帮到你,蒂埃里

票数 1
EN

Stack Overflow用户

发布于 2015-12-08 20:47:10

通过使用xmlhttprequest npm包,然后在我的node_modules文件夹中的d3.js文件中,我在定义了d3_xhr函数的第1934行添加了这个问题。

代码语言:javascript
复制
var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;

这样,当我在节点中工作时,我的d3总是可以发出xhr请求。我希望更多的人能发现这一点,因为这是一个超级容易的解决方法,似乎没有多少人考虑去克服节点中缺乏内置xhr支持的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33815684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档