2016-02-01 167 views
2

要顯示用戶發送作業到羣集我有以下代碼(簡化)當快遞+ SSH2不會重置我的數據結構:節點JS:加載網頁

var split = require('split'); 
var Client = require('ssh2').Client; 
var conn = new Client(); 

var globalRes; 
var table = [["Head_1","Head_2"]]; 

module.exports = { 
    renderTable: function(req, res) { 

     conn.connect({host: 'xx.xx.xx.xx', port: 22, username: 'xxxxx', password: 'xxxxx'}); 

     globalRes = res; 
     table = [["Head_1","Head_2"]]; 
     conn.on('ready', function() { conn.shell(doSomething);}); 
    } 
} 

function doSomething(err, stream) { 

    stream.on('close', function() { 
     conn.end(); 
     globalRes.render('index', { HTMLtable: table }); 
     console.log(table); 
    }); 
    stream.pipe(split()).on('data', buildTable); 
    stream.write('qstat -s z\n'); 
    stream.end('exit\n'); 
} 

function buildTable(line) { 
    var newLine = [1, 2]; 
    if(line.substring(0,6) == "job-ID") { 
     table.push(newLine); 
    } 
    return; 
} 

它打開一個ssh連接,接收到數據後呈現該頁面。

問題:僅在第一次它執行權,在我們的例子CONSOLE.LOG所示:

[[ 'Head_1', 'Head_2'],[1,2]] < < <這是好的。

但是從第一次開始,每次頁面加載時,代碼就會堆棧在'表'數據結構上。換句話說,如果我們第二次重新加載頁面(或在另一個瀏覽器中首次加載相同頁面)console.log顯示:

[['Head_1','Head_2'],[1,2 ],[1,2]]

[[ 'Head_1', 'Head_2'],[1,2],[1,2]]

所以,不僅 '表' 是越來越額外行[1,2](它不應該),但命令console.log執行兩次。

如果加載頁面,第三次,現在我們得到:

[ 'Head_1', 'Head_2'],[1,2],[1,2],[1,2]

[[ 'Head_1', 'Head_2'],[1,2],[1,2],[1,2]]

[[ 'Head_1', 'Head_2'],[1 ,2],[1,2],[1,2]]

'table'隨着console.log執行時間的增長而增長。

在此先感謝您提供的任何幫助。

+0

我的猜測是這張表在全球範圍內,因此你看到的問題。做這樣的事情:tableMap [「userName」] = {}其中{}是當前使用它的表對象。你也可以使用閉包來解決這個問題。 –

+0

你說得對,邁克爾,全球範圍內的變數都造成了這個問題。 –

回答

0

好的,問題解決了。我只是爲了防止其他人遇到類似問題而發佈,這可能會讓我們有所瞭解。

這是由於我的JavaScript不良編碼做法。它可以工作,如果你在函數renderTable中包含了所有內容,這就是ZERO(0)全局變量。

的所有功能,所有變量(重要提示:包括「需要()的)內部:

module.exports = { 
    renderTable: function(req, res) { 

      <<<< Put everything here. 

    } 
} 

事實上,這樣的變量「globalRes」是不必要的,只是用「資源」,因爲它應該。

希望這會有所幫助。我不打算將自己的答案標記爲正確,所以如果有人想獲得技術並解釋失敗的具體原因,我會檢查答案是否正確。