2016-07-26 13 views
0

Ich versuche mit Handlebars einige Daten anzuzeigen, die von einer MySQL-Abfrage zurückgegeben werden. Die Route sieht wie folgt aus:Das Rendern von MySQL führt zu Express/Node.js: Kann der Nur-Lese-Eigenschaft '_locals' nicht zuweisen

var query = "SELECT col1, col2, col3 FROM table WHERE section >= " + start + " AND section <= " + end + " ORDER BY col1 ASC"; 

connection.query(query, function(err, result) { 
    if (err) throw err 

    var data = JSON.stringify(result); 

    console.log(data); 

    res.render('text', data); 
}); 

‚data‘ sieht genau wie ich es will, mit einer Reihe von Objekten, die die drei Säulen und die richtigen Werte haben. Der entsprechende Abschnitt meiner Lenker wie folgt aussieht:

{{#each data}}{{data.col2}}{{/each}} 

Und dann, wenn ich versuche, die Seite zu laden, bekomme ich folgende Fehler (ich kann mehr zeigen, wenn es helfen würde):

TypeError: Cannot assign to read only property '_locals' of <and then my array of objects followed by a stack trace> 

I Ich glaube nicht, dass ich etwas darüber verstehe, wie die MySQL-Abfrage zurückgegeben wird.

Antwort

1

Entfernen Sie die JSON.stringify() Linie vollständig und übergeben { result: result } (oder nur { result }, wenn Sie eine moderne Version des Knotens (v4.x +) haben) direkt auf Ihrem res.render().

Diese Zeile konvertiert das Datenbankergebnis in einen JSON String. Ein JSON String und ein JavaScript-Objekt sind nicht identisch. Indem Sie die JSON.stringify() weglassen, behalten Sie result ein richtiges Array (keine Zeichenfolge, die ein Array enthält), die in Ihrer Vorlage iteriert werden kann.

Auch Lenker Vorlage müsste so aussehen:

 
{{#each result}}{{this.col2}}{{/each}} 
+0

Ok ersetzt, so dass mein Ergebnis ist nun ein namenlos Array von RowDataPacket wie so: '[RowDataPacket {col1: 1 , Spalte2: 'Lorem', Spalte3: ''}, RowDataPacket {Spalte1: 2, Spalte2: 'Ipsum', Spalte3: ''}, RowDataPacket {Spalte1: 3, Spalte2: 'dol oder ', col3:' '}, RowDataPacket {col1: 4, col2:' sitzen '', col3: ','} ' Wenn ich dies an Lenker als" Ergebnis "übergeben, wie schleife ich es über? {{jedes Ergebnis}} {{result.col2}} {{/ each}} funktioniert nicht. – Kramhsiri

1

Es scheint, dass Sie String-Typ data der Vorlage sind vorbei.

Versuchen Sie, die Linie

res.render('text', data);

zu

res.render('text', result);

+0

@Kramhsiri zu 'res.render ('text', {result: result}) wechseln;' dann wird Ihre Schleife funktionieren. – Calvinxiao