无法在nodejs中获得适当的值

时间:2017-11-03 16:02:38

标签: javascript node.js

我在下面的代码中遇到一些问题,我查询数据库并使用结果来填充动态表。查询似乎没有问题,但for循环没有从上面获取适当的值。我怎么能解决这个问题

//grab result from doneon table and show on report
  connection.query('SELECT * FROM doneon WHERE SampID LIKE ?', id, (err, rows, fields) => {
    if(err){
      return console.log('An error ocurred with the query', err)
    }
    var tabldiv = document.getElementById('tabldivid')
    var table = document.createElement('TABLE')
    var tableBody = document.createElement('TBODY')

    // table.style.border = '3px solid black'
    table.style.width = '100%'
    table.id = 'tablid'
    table.appendChild(tableBody);

    var heading = new Array();
    heading[0] = "Test"
    heading[1] = "Result"
    heading[2] = "Normal values"

    for(i=0; i <rows.length; i += 1) {
      var resu = new Array()
      resu[i] = rows[i]
      console.log(rows[i]);
    }

    //TABLE COLUMNS
    var tr = document.createElement('TR');
    tableBody.appendChild(tr);
    for (i = 0; i < heading.length; i++) {
        var th = document.createElement('TH')
        th.width = '75';
        th.appendChild(document.createTextNode(heading[i]));
        tr.appendChild(th);
    }

    //TABLE ROWS
    for (i = 0; i < resu.length; i++) {
        var tr = document.createElement('TR');
        for (j = 0; j < resu[i].length; j++) {
            var td = document.createElement('TD')
            td.appendChild(document.createTextNode(resu[i][j]));
            tr.appendChild(td)
        }
        tableBody.appendChild(tr);
    }
    tabldiv.appendChild(table)
  })

1 个答案:

答案 0 :(得分:0)

John在每次迭代for循环时初始化一个新的resu数组是正确的。通过在每次迭代时初始化一个新的resu数组,您只填充resu的第i个索引,然后在下一次迭代中,resu变量再次重新初始化,并且旧数据填充resu 被覆盖。这会将resu中的所有索引保留为未定义,但当前的第i个索引。

例如,让我们说SQL查询的结果为我们提供了以下rows数组:

rows = ['a', 'b', 'c', 'd', 'e', 'f'];

这是每个循环中resu中的数据发生的事情(注意从迭代2开始的未定义索引):

迭代1: resu = ['a'];

迭代2: resu = [,'b'];

迭代3: resu = [,,'c'];

迭代4: resu = [,,,'d'];

......等等。然后,当您在resu上的第0个索引上运行for循环时,第0个索引未定义。这就是为什么你在3th for循环中得到一个未定义的错误,但是当console.logging resu.lengthrows.length

时你仍然得到一个结果

但我真的想知道你是否需要一个单独的resu数组。我相信只需遍历rows数组就可以得到相同的结果来创建表行:

for (i = 0; i < rows.length; i++) {
    ......
    for (j = 0; j < rows[i].length; j++) {
        ......
    }
}

这样你就可以完全省略你的第一个for循环。如果由于某种原因确实需要重复rows数组,你仍然可以省略for循环,而应该用这种方式初始化它:

var resu = rows;

这仍然会产生一个重复的数组,但它会减少你的运行时间,因为你不会不必要地迭代一个数组。