2016-04-26 20 views
1

我使用NodeJS和Socket.io從數據庫中獲取數據。我現在想用這些數據填寫谷歌區域圖表,但我有點失敗。 數據以Objects傳輸。每個Object包含兩個值(日期時間和值)。我這些值追加到一個數組,然後將它們存儲在DataTable使用Socket.io填充谷歌區域圖 - 'google.visualization.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不是constructor' 。那麼我做錯了什麼?

回答

1

問題是drawChart被調用兩次。
來自google.setOnLoadCallbackgetData
如果在google.setOnLoadCallback之前調用getData,
則不會識別google.visualization.DataTable

另外,推薦使用loader.jsjsapi
更多信息,請參見Load the Libraries ...

因此,請嘗試以下...

替換...
<script src="https://www.google.com/jsapi"></script>

與...
<script src="https://www.gstatic.com/charts/loader.js"></script>

並嘗試類似...

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' 
     } 
    }) 
} 
+0

現在我得到錯誤'io'沒有被定義,並且找不到文件'C:\ socket.io \ socket.io.js'。這可能是真的,因爲'socket.io'被放置在我的目錄中的'node_modules'文件夾中,其中'npm'保存了它的所有模塊。 – binaryBigInt

+0

我在做這個確切的whay,因爲它在這裏描述:http://stackoverflow.com/questions/8689877/cant-find-socket-io-js – binaryBigInt

+1

如果你刪除一切_google charts_相關的,你能夠得到來自'socket.io'的數據?如果是這樣,您可能需要切換事物順序,獲取數據,然後加載_google_。如果不是,這可能是另一個問題的話題......? – WhiteHat