12

Ok, so I am attempting to move a fairly complex highcharts rendering script from the front end to server-side processing via nodejs

Its actually gone fairly well. I have "no errors" and the chart is rendering out with the data into svg. The problem is when I go to view the outputted svg in the browser its all messed up. In firebug I get the following "warning":

Unexpected value NaN parsing y attribute.
Unexpected value NaN parsing x attribute.
Unexpected value NaN parsing y attribute.
Unexpected value NaN parsing x attribute.

My question is, how can I go about debugging this? I have no idea where the NaN value is being calculated in highcharts source, and get no traditional js errors in the console. What is essentially the same code is currently working fine in an actual browser environment, but is failing when processed with nodejs and domjs, so its likely the issue has to do with that.

Here is my node script:

# base libs
{jsdom} = require 'jsdom'
jade    = require 'jade'
fs      = require 'fs'

# chart and settings
Chart               = require './classes/Chart'
Config              = require './config/config.base'
HighchartSettings   = require './config/config.highchart

# curl -d "width=200px&height=100px&device=mobile&resolution=DAILY&type=areaSpline" http://localhost:8000/chart

app.post '/chart', (req, res) ->
    # get post params
    jadeOptions = 
        height  : req.param('height', null)
        width   : req.param('width', null)
    isEnglish   = req.param 'isEnglish', true
    resolution  = req.param 'resolution', null
    chartType   = req.param 'type', null

    device = if req.param('device', 'mobile') is 'mobile' then { mobile : true, tablet : false} else { mobile : false, tablet : true }

    # render dom from jade
    jade.renderFile 'views/chart.jade', jadeOptions, (err, html) ->

        # setup virtual browser
        dom                 = jsdom html
        window              = dom.createWindow()
        {host}              = req.headers
        {document}          = window
        window.console.log  = console.log

        # get localization localization
        window.localization     = Localization isEnglish

        # generate chart settings
        configSettings          = Config device, window.localization
        configSettings          = configSettings[resolution][chartType]
        chartSettings           = HighchartSettings device

        # add jquery
        jsdom.jQueryify window, 'http://'+host+'/jquery.1.7.2.min.js', ->   

            {$} = window

            # add highcharts lib to virtual browser 
            highchartsjs        = document.createElement 'script'
            highchartsjs.type   = 'text/javascript'
            highchartsjs.src    = 'http://'+host+'/highcharts.custom.js'
            highchartsjs.onload = -> 
                {Highcharts} = window

                # don't mess with me, highcharts will cut you!
                Highcharts.setOptions
                    global :
                        useUTC : true

                chartDailyJSONDummy = JSON.parse 'there is real json here, I have removed it for the sake of SO'

                try 
                    chart = new Chart configSettings, chartSettings, chartDailyJSONDummy, Highcharts, ->
                        output = $('#chartWrapper').html()
                        res.setHeader "Content-Type", "text/html"
                        res.write output
                        res.end()
                        console.log 'Chart sent \n'
                catch err 
                    console.log err
                    res.send 'error, see log \n'

            document.body.appendChild highchartsjs  

My highcharts configuration as displayed in the console:

{ chart: 
   { renderTo: 'chartContainer',
     backgroundColor: 'none',
     events: { load: [Function] },
     animation: false,
     renderer: 'SVG' },
  title: 
   { text: 'Today vs Yesterday',
     style: { color: 'white', fontSize: '17px', lineHeight: '22px' },
     margin: 18,
     y: 18 },
  subtitle: { text: null },
  xAxis: 
   { type: 'datetime',
     labels: { step: 12, formatter: [Function], style: [Object], y: 20 },
     tickInterval: 3600000,
     tickLength: 6,
     tickWidth: 2,
     startOnTick: true,
     endOnTick: true,
     maxPadding: 0 },
  yAxis: 
   [ { title: [Object], labels: [Object] },
     { title: [Object], labels: [Object], linkedTo: 0, opposite: true } ],
  legend: { enabled: false },
  credits: { enabled: false },
  tooltip: { enabled: false },
  plotOptions: 
   { areaspline: 
      { color: '#19b6f4',
        marker: [Object],
        enableMouseTracking: false },
     spline: 
      { color: '#d01b7c',
        marker: [Object],
        enableMouseTracking: false } },
  series: 
   [ { type: 'areaspline', data: [Object], animation: false },
     { type: 'spline', data: [Object], animation: false } ] }   

UPDATE Here is a sample of the data that currently appears in series as [Object]

[ [ 1363562100000, 0.358 ],
  [ 1363563000000, 0.498 ],
  [ 1363563900000, 0.241 ],
  [ 1363564800000, 0.211 ],
  [ 1363565700000, 0.426 ],
  [ 1363566600000, 0.58 ],
  [ 1363567500000, 0.195 ],
  [ 1363568400000, 0.217 ],
  [ 1363569300000, 0.185 ],
  [ 1363570200000, 0.19 ],
  [ 1363571100000, 0.223 ],
  [ 1363572000000, 0.18 ],
  [ 1363572900000, 0.164 ],
  [ 1363573800000, 0.188 ],
  [ 1363574700000, 0.16 ],
  [ 1363575600000, 0.166 ],
  [ 1363576500000, 0.188 ],
  [ 1363577400000, 0.154 ],
  [ 1363578300000, 0.162 ],
  [ 1363579200000, 0.1715 ],
  [ 1363580100000, 0.1715 ],
  [ 1363581000000, 0.173 ],
  [ 1363581900000, 0.189 ],
  [ 1363582800000, 0.151 ],
  [ 1363583700000, 0.179 ],
  [ 1363584600000, 0.288 ],
  [ 1363585500000, 0.496 ],
  [ 1363586400000, 0.175 ],
  [ 1363587300000, 0.2 ],
  [ 1363588200000, 0.185 ],
  [ 1363589100000, 0.439 ],
  [ 1363590000000, 1.19 ],
  [ 1363590900000, 0.495 ],
  [ 1363591800000, 0.294 ],
  [ 1363592700000, 0.286 ],
  [ 1363593600000, 0.28 ],
  [ 1363594500000, 0.845 ],
  [ 1363595400000, 2.055 ],
  [ 1363596300000, 2.03 ],
  [ 1363597200000, 1.611 ],
  [ 1363598100000, 1.936 ],
  [ 1363599000000, 1.499 ],
  [ 1363599900000, 1.876 ],
  [ 1363600800000, 1.699 ],
  [ 1363601700000, 1.667 ],
  [ 1363602600000, 1.862 ],
  [ 1363603500000, 1.496 ],
  [ 1363604400000, 2.312 ],
  [ 1363605300000, 2.056 ],
  [ 1363606200000, 0.878 ],
  [ 1363607100000, 1.339 ],
  [ 1363608000000, 0.69 ],
  [ 1363608900000, 1.259 ],
  [ 1363609800000, 0.884 ] ]

UPDATE 2 Issue does not seem to be caused by may highcharts configuration, but rather the jsdom environment missing some critical component. I suspect this because when using an older copy of highcharts, the problem isn't there, but then again my script is not structured for the older version and the chart renders with missing features.

2.0.5 WORKS

2.2.5 DOES NOT

project needs to be in 2.2.5

REALLY I JUST WANT A WAY TO DEBUG THIS

4

2 回答 2

1

我不可能轻松地重现该问题,但这里有一些您可能想要遵循的线索:

Highchart 问题#1300

修复了由于标签的 y 属性为 NaN 而导致导出空图表的错误

Highsoft 论坛上对此进行了一些讨论。

正如他们的更新日志2.3.5中所报告的那样,此问题已得到修复。

在大多数情况下,当收到数据时,它似乎是一个警告null,所以你确定这个数据被返回了吗?也许您的图表是在返回对象数据之前加载的?我只是在大声思考。

于 2013-03-21T16:29:18.287 回答
0

这不是一个解决方案,只是一个提示。

我认为你需要把这个问题分解成一个更小的问题,让它起作用并小心地增加它。他们你会发现事情正在打破你的腿。重新开始并重做,直到发现问题。

于 2013-04-15T13:34:14.803 回答