【问题标题】:Use Socket.io to fill google Area Chart - 'google.visualization.DataTable is not a constructor'使用 Socket.io 填充 google 面积图 - 'google.visualization.DataTable 不是构造函数'
【发布时间】:2016-04-26 19:20:01
【问题描述】:

我使用 NodeJS 和 Socket.io 从数据库中获取数据。我现在想用这些数据填充谷歌面积图,但我做不到。 数据以Objects 传输。每个Object 包含两个值(日期时间和值)。我将这些值附加到一个数组中,然后将它们存储在DataTable

google.load('visualization', '1', {
    packages: ['corechart']
});
google.setOnLoadCallback(drawChart);

var socket = io();
getData();

function drawChart(dataArray) {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'DateTime');
    data.addColumn('number', 'Value');
    for (var i = 0; i < dataArray.length; i += 2) {
        console.log(dataArray[0]);
        data.addRow([dataArray[i], dataArray[i + 1]]);
    }
    var chart = new google.visualization.AreaChart(document.getElementById('chart'));
    chart.draw(data, {
        title: "Data Visualization",
        isStacked: true,
        width: '50%',
        height: '50%',
        vAxis: {
            title: 'Data v-Axis'
        },
        hAxis: {
            title: 'Data h-Axis'
        }
    })
}

function getData() {
    socket.emit('GET');
    socket.on('serverSent', function (data) {
        var processedData = processData(data);
        drawChart(processedData);
    })
}

function processData(data) {
    var arr = new Array();
    jQuery.each(data, function (index, object) {
        arr.push(object['datetime'], parseInt(object['value']));
    })
    return arr;
}

如果我调用我的网站,我会看到图表但没有任何值,并且错误消息“google.visualization.DataTable 不是构造函数”。那我做错了什么?

【问题讨论】:

    标签: node.js socket.io google-visualization


    【解决方案1】:

    问题是drawChart 被调用了两次。
    来自google.setOnLoadCallbackgetData
    如果getDatagoogle.setOnLoadCallback 之前被调用,
    那么google.visualization.DataTable 将不会被识别。

    另外,建议使用loader.js vs. jsapi
    请参阅Load the Libraries 了解更多信息...

    因此,请尝试以下...

    替换...
    &lt;script src="https://www.google.com/jsapi"&gt;&lt;/script&gt;

    与...
    &lt;script src="https://www.gstatic.com/charts/loader.js"&gt;&lt;/script&gt;

    然后尝试类似...

    google.charts.load('current', {
        callback: init,
        packages: ['corechart']
    });
    
    function init() {
        var socket = io();
        socket.emit('GET');
        socket.on('serverSent', function (data) {
            var processedData = processData(data);
            drawChart(processedData);
        });
    }
    
    function drawChart(dataArray) {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'DateTime');
        data.addColumn('number', 'Value');
        for (var i = 0; i < dataArray.length; i += 2) {
            console.log(dataArray[0]);
            data.addRow([dataArray[i], dataArray[i + 1]]);
        }
        var chart = new google.visualization.AreaChart(document.getElementById('chart'));
        chart.draw(data, {
            title: "Data Visualization",
            isStacked: true,
            width: '50%',
            height: '50%',
            vAxis: {
                title: 'Data v-Axis'
            },
            hAxis: {
                title: 'Data h-Axis'
            }
        })
    }
    

    【讨论】:

    • 现在我收到错误 io 未定义并且找不到文件 C:\socket.io\socket.io.js。这可能是真的,因为socket.io 位于我的目录中的node_modules 文件夹中,npm 保存了它的所有模块。
    • 我正在按照此处描述的方式进行操作:stackoverflow.com/questions/8689877/cant-find-socket-io-js
    • 如果您删除所有与 google 图表 相关的内容,您是否能够从 socket.io 获取数据?如果是这样,您可能想要切换事物的顺序,获取数据,然后加载 google。如果没有,它可能是另一个问题的主题......?
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2019-06-13
    • 2011-03-28
    相关资源
    最近更新 更多