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

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'。

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

09-25 17:15
查看更多