在加载网页时,节点js:Express + ssh2不重置我的数据结构

显示用户发送到集群的作业我有以下代码(简化):

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 -sz\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被执行的时间而增长。

预先感谢您提供的任何帮助。

好的,问题解决了。 我只是为了防止其他人有类似的问题发布,这可能会stream露出一些光芒。

这是由于我的Javascript不好的编码习惯。 它可以工作,如果你在函数renderTable中包含了所有的东西,这是零(0)全局variables。

所有函数,所有variables(重要:包括'require()')里面:

 module.exports = { renderTable: function(req, res) { <<<< Put everything here. } } 

事实上,这种方式variables'globalRes'是不必要的,只要使用'res'就可以了。

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