2016-12-05 1 views
0

Я учусь использовать mysql модуль в Node.js, поэтому я использую его с Express & Mustache для отображения таблицы MySQL и придумал это:для (... в ...) цикл не работает в node.js

var express = require('express'); 
var app = express(); 

var mu2 = require('mu2'); 
mu2.root = __dirname + '/views'; 

var mysql = require('mysql'); 
var con = mysql.createConnection({ 
    host: "localhost", 
    user: "root", 
    password: "root", 
    port: 3306, 
    database: 'breakthrough' 
}); 

con.connect(function (err) { 
    if (err) { 
     console.log('Error connecting to database:\n' + err); 
     return; 
    } 
}); 

app.get('*', function (req, res) { 
    var tableHTML; 
    function renderTable(rows) { 
     tableHTML = "<table>"; 
     for (var row in rows) { 
      tableHTML += "<tr>"; 
      for (var cell in row) { 
       tableHTML += ("<td>" + cell + "</td>"); 
      } 
      tableHTML += "</tr>"; 
     } 
     tableHTML += '</table>'; 
    } 
    con.query('SELECT * FROM drivers', function (err, rows){ 
     if (err) { throw(err); } 
     renderTable(rows); 
     htmlStream = mu2.compileAndRender('frontPage.html', {table: tableHTML}); 
     htmlStream.pipe(res); 
    }); 
}); 

app.listen(8080, function() { 
    console.log("Listening on port 8080."); 
}); 

Но результирующая таблица только показывают нули, один для каждой строки:

<table> 
    <tr><td>0</td></tr> 
    <!-- tr repeated for each row in rows --> 
</table> 

Некоторые чтения предполагают, что итерация объектов в Node.js в настоящее время весьма проблематично. Есть ли способ, которым я могу лениво перебирать объекты node.js?

+1

'cell' - это индекс. Если вы хотите получить содержимое, вам нужно напечатать 'row [cell]' (а также перебрать строку 'row [row]'). – JJJ

ответ

1

кажется, что строки является массивом (согласно https://www.npmjs.com/package/mysql), поэтому, когда вы делаете:

for(var row in rows) 

строки принимают только индекс, а не значение, поэтому ваш второй цикл не так. Кроме того взять только индекс, а не значение

Изменить его:

for (var row in rows) { 
    tableHTML += "<tr>"; 
    for (var cell in rows[row]) { 
     tableHTML += ("<td>" + rows[row][cell] + "</td>"); 
    } 
    tableHTML += "</tr>"; 
} 

Но цикл по массиву, используя для в это не очень хорошая идея, см Why is using "for...in" with array iteration a bad idea?

Использование:

 for (var i = 0; i < rows.length; i++) { 
     tableHTML += "<tr>"; 
     for (var cell in rows[i]) { 
      tableHTML += ("<td>" + rows[i][cell] + "</td>"); 
     } 
     tableHTML += "</tr>"; 
     }