ब्राउज़र में d3 चार्ट रेंडर करने के लिए js को व्यक्त करने के लिए इसे पास करने से पहले नोड js में डेटा लोड करने की कोशिश कर रहा हूँ।

मैं समझता हूं कि मैं इस तरह से डेटा लोड कर सकता हूं - https://github.com/mbostock/queue

मेरे पास एक्सप्रेस जेएस मार्ग इस तरह से कॉन्फ़िगर किया गया है -

    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;

लेकिन मुझे ब्राउज़र त्रुटि मिल रही है,

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

इस RESTful डेटा को प्री-लोड करने के लिए मैं d3 और कतार का उपयोग कैसे करूं?

2
Colin 20 नवम्बर 2015, 01:40

2 जवाब

सबसे बढ़िया उत्तर

डी 3 लाइब्रेरी एक क्लाइंट-साइड है। इसका मतलब यह है कि इसे एक सर्वर-साइड एप्लिकेशन के भीतर नहीं ब्राउज़र के भीतर उपयोग किया जाना चाहिए।

यदि आप डेटा प्राप्त करना चाहते हैं और अपने एक्सप्रेस आवेदन में उन्हें संक्षिप्त करना चाहते हैं, तो आप नीचे वर्णित अनुसार async और अनुरोध का उपयोग कर सकते हैं:

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 चर में सभी प्रतिक्रिया सामग्री के साथ एक सरणी होगी।

आप एक्सप्रेस रूट रिटर्न चाहते हुए ऑब्जेक्ट का निर्माण करने के लिए इस सरणी का लाभ उठा सकते हैं।

यहाँ आपके कोड का अद्यतन है:

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
Thierry Templier 20 नवम्बर 2015, 09:11

मैंने इस मुद्दे को xmlhttprequest npm पैकेज का उपयोग करके प्राप्त किया और फिर अपने d3.js फ़ाइल के अंदर अपने नोड_मॉडल फ़ोल्डर में मैंने इसे 1934 की लाइन में जोड़ा जहां d3_xhr फ़ंक्शन परिभाषित है।

var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;

इस तरह मेरा d3 नोड में काम करते समय हमेशा xhr अनुरोध कर सकता है। मुझे आशा है कि अधिक लोगों को यह पता चलेगा क्योंकि यह एक सुपर आसान फिक्स है जो बहुत से लोगों को नोड में अंतर्निहित xhr समर्थन की कमी को दूर करने के बारे में सोचने के लिए नहीं लगता है।

1
Ian H 8 पद 2015, 20:54