【问题标题】:dc.js with node.js server sidedc.js 与 node.js 服务器端
【发布时间】:2014-01-31 15:20:11
【问题描述】:

我想用 node.js 在服务器上渲染 dcCharts。我有一个 d3.js 和 node.js 的例子。但我的代码不起作用。我是 node.js 的初学者,希望你有一个想法?

d3.js 和 node.js 的代码:example

在这里我尝试使用 dc.js 和 node.js:

var d3 = require('d3')
, dc = require('dc')
, jsdom = require('jsdom')
, fs = require('fs')
, htmlStub = '<html><head></head><body><div id="dataviz-container"></div><script    src="js/d3.v3.min.js"></script></body></html>'

jsdom.env({
features : { QuerySelector : true }
, html : htmlStub
, done : function(errors, window) {
// this callback function pre-renders the dataviz inside the html document, then    export result into a static file

var el = window.document.querySelector('#dataviz-container')
, body = window.document.querySelector('body')

var data = [
    {date: "12/27/2012", http_404: 2, http_200: 190, http_302: 100},
    {date: "12/28/2012", http_404: 2, http_200: 10, http_302: 100},
    {date: "12/29/2012", http_404: 1, http_200: 300, http_302: 200},
    {date: "12/30/2012", http_404: 2, http_200: 90, http_302: 0},
    {date: "12/31/2012", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/01/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/02/2013", http_404: 1, http_200: 10, http_302: 1},
    {date: "01/03/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/04/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/05/2013", http_404: 2, http_200: 90, http_302: 0},
    {date: "01/06/2013", http_404: 2, http_200: 200, http_302: 1},
    {date: "01/07/2013", http_404: 1, http_200: 200, http_302: 100}
    ];

var ndx = crossfilter(data);

var parseDate = d3.time.format("%m/%d/%Y").parse;

data.forEach(function(d) {
d.date = parseDate(d.date);
d.total= d.http_404+d.http_200+d.http_302;
});

var dateDim = ndx.dimension(function(d) {return d.date;});
var hits = dateDim.group().reduceSum(function(d) {return d.total;});

var hitslineChart  = dc.pieChart('dataviz-container');
hitslineChart
.width(500).height(200)
.transitionDuration(500)
.colors(d3.scale.category10())
.radius(90)
.dimension(dateDim)
.group(hits);

dc.renderAll();





// save result in an html file, we could also keep it in memory, or export the       interesting fragment into a database for later use
var svgsrc = window.document.innerHTML
fs.writeFile('index.html', svgsrc, function(err) {
if(err) {
console.log('fehler beim speichern', err)
} else {
console.log('Datei wurde gespeichert!')
}
})  
} // end jsDom done callback
})

我认为var hitslineChart = dc.pieChart('dataviz-container'); 是错误的。


我改知道我的 htmlStub 和 dc.pieChart:

var hitslineChart  = dc.pieChart('el');

htmlStub = '<html><head></head><body><div id="dataviz-container"></div></script><script type="text/javascript" src="js/d3.js"></script><script type="text/javascript" src="js/crossfilter.js"></script><script type="text/javascript" src="js/dc.js"></script></body></html>'

不幸的是,我仍然收到此错误:

C:\Users\kasse\Code\node-modules\dc\dc.js:2366
    var _colors = d3.scale.category20c();

ReferenceError: d3 is not defined
at Object.dc.colorChart (C:\Users\kasse\Code\node_modules\dc\dc.js:2366:19)
at Object.dc.pieChart (C:\Users\kasse\Code\node_modules\dc\dc.js:2971:31)
at jsdom.env.done (C:\Users\kasse\Code\pre_render.js:44:25)
at C:\Users\kasse\Code\node_modules\jsdom\lib\jsdom.js:255:9
at process._tickCallback (node.js:415:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)
at node.js:902:3

感谢您的帮助。

【问题讨论】:

标签: node.js d3.js dc.js


【解决方案1】:

你需要在你的模块中使 d3 成为一个全局变量:

global.d3 = d3;

... chart rendered here
dc.renderAll();

    var svgsrc = window.document.querySelector('#bubbleChart');
    fs.writeFile('chart.svg', svgsrc.innerHTML, function(err) {
        if (err) {
            console.log('error saving document', err);
        } else {
            console.log('The file was saved!');
        }
    }); 

然后使用 ImageMagick 等命令行工具将 svg 转换为 png。有关示例,请参见此帖子: http://eng.wealthfront.com/2011/12/converting-dynamic-svg-to-png-with.html

【讨论】:

  • 很遗憾,我最后没有得到一个图表......你知道我最后是如何得到一个 png-Chart 的吗?
  • 您现有的代码应该已经生成了一个 html 文件。您可以通过使用 Web 浏览器查看文件来手动处理该文件。如果您想要一个更自动化的过程,那么您可以将输出保存为 .svg 文件而不是 HTML。代码看起来就像我在上面添加的代码。
  • 嗨史蒂夫,如果我用浏览器打开它。我只得到一页。那里出了点问题
  • 我只是在结果 html 文件中得到了 undefided
【解决方案2】:

您的 htmlStub 错误,它有一个额外的 &lt;/script&gt; ;这几乎肯定会导致 node.js 无法运行它。

应该(可能)是:

htmlStub = '<html><head></head><body><div id="dataviz-container"></div><script type="text/javascript" src="js/d3.js"></script><script type="text/javascript" src="js/crossfilter.js"></script><script type="text/javascript" src="js/dc.js"></script></body></html>';

如果你分解字符串,这样的错误会更明显:

   htmlStub  = '<html><head></head><body>';
   htmlStub += '<div id="dataviz-container"></div>';
   htmlStub += '<script type="text/javascript" src="js/d3.js"></script>';
   htmlStub += '<script type="text/javascript" src="js/crossfilter.js"></script>';
   htmlStub += '<script type="text/javascript" src="js/dc.js"></script>';
   htmlStub += '</body></html>';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 2016-09-09
    • 2013-08-23
    • 2014-04-01
    • 2011-06-02
    • 2016-02-24
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多