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

Node js: Express + ssh2 does NOT reset my data structures when loading web pages

本文关键字:数据结构 我的 网页 加载 js Express ssh2 节点      更新时间:2023-09-26

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

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 连接,在收到数据后呈现页面。

问题:在我们的示例控制台中,只有第一次正确执行时.log才会显示:

[

[ 'Head_1', 'Head_2' ], [ 1, 2 ] ] <<<这很好。>

但是从第一次开始,每次加载页面时,代码都会堆积在"表"数据结构上。换句话说,如果我们第二次重新加载页面(或在另一个浏览器中首次加载同一页面(控制台.log将显示:

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

[ 1, 2 ]

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

[ 1, 2 ]

]

因此,不仅"table"会获得额外的行 [1,2](它不应该(,而且命令控制台.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 ]

]

"表"随着控制台.log的执行次数而增长。

提前感谢您提供的任何帮助。

好的,问题解决了。我发帖只是以防其他人有类似的问题,这可能会有所启发。

这是由于我的Javascript糟糕的编码实践。如果您将所有内容都包含在函数 renderTable 中,它就会起作用,这是零 (0( 个全局变量。

所有

函数,所有变量(重要提示:包括里面的'require(('s(:

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

事实上,这样变量"globalRes"是不必要的,只需使用"res"即可。

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