为了显示用户发送到集群的作业,我有以下代码(简化):
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]]
随着console.log被执行的时间,“表”正在增长。
在此先感谢您提供的任何帮助。
最佳答案
好,问题解决了。我发帖是为了防止其他人遇到类似的问题,这可能会给您一些启示。
这是由于我的Javascript错误的编码做法。如果您在函数renderTable中包含所有内容,则该方法有效,这是零(0)全局变量。
内部的所有函数,所有变量(重要:包括'require()'):
module.exports = {
renderTable: function(req, res) {
<<<< Put everything here.
}
}
实际上,这种方式不需要变量'globalRes',只需按原样使用'res'。
希望这可以帮助。我不会将自己的答案标记为正确,因此,如果有人希望获得技术知识并解释其失败的具体原因,我将检查该答案是否正确。