d3.js queue.js 和 node.js
d3.js queue.js and node.js
我试图在将数据传递给 expressjs 以在浏览器中呈现 d3 图表之前在 nodejs 中加载数据。
我知道我可以通过这种方式加载数据 -
https://github.com/mbostock/queue
我有一个这样的 expressjs 路由配置 -
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
如何使用 d3 和队列预加载此 RESTful 数据?
d3 库是客户端库。这意味着它必须在浏览器中使用,而不是在服务器端应用程序中使用。
如果您想获取数据并在您的 Express 应用程序中连接它们,您可以使用 async 和 request,如下所述:
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 路由 returns。
这是您的代码更新:
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;
希望对你有帮助,
蒂埃里
我通过使用 xmlhttprequest npm 包解决了这个问题,然后在我的 node_modules 文件夹中的 d3.js 文件中,我在第 1934 行添加了这个d3_xhr 函数已定义。
var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
这样,当我在 node.js 中工作时,我的 d3 总是可以发出 xhr 请求。我希望更多的人发现这个,因为这是一个超级简单的修复,似乎没有多少人考虑这样做来克服节点中缺乏内置 xhr 支持的问题。
我试图在将数据传递给 expressjs 以在浏览器中呈现 d3 图表之前在 nodejs 中加载数据。
我知道我可以通过这种方式加载数据 - https://github.com/mbostock/queue
我有一个这样的 expressjs 路由配置 -
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
如何使用 d3 和队列预加载此 RESTful 数据?
d3 库是客户端库。这意味着它必须在浏览器中使用,而不是在服务器端应用程序中使用。
如果您想获取数据并在您的 Express 应用程序中连接它们,您可以使用 async 和 request,如下所述:
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 路由 returns。
这是您的代码更新:
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;
希望对你有帮助, 蒂埃里
我通过使用 xmlhttprequest npm 包解决了这个问题,然后在我的 node_modules 文件夹中的 d3.js 文件中,我在第 1934 行添加了这个d3_xhr 函数已定义。
var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
这样,当我在 node.js 中工作时,我的 d3 总是可以发出 xhr 请求。我希望更多的人发现这个,因为这是一个超级简单的修复,似乎没有多少人考虑这样做来克服节点中缺乏内置 xhr 支持的问题。