2016-02-01 112 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”是不必要的,只是用“资源”,因为它应该。

希望这会有所帮助。我不打算将自己的答案标记为正确,所以如果有人想获得技术并解释失败的具体原因,我会检查答案是否正确。