2017-07-23 3 views
0

Ich versuche, eine Excel-Arbeitsmappe mit Excel Builder zu erstellen und die Daten mit Informationen aus einer MySQL-Datenbank zu füllen. Das ist meine get-Methode:Async Node JS Abfrage Verbindung

app.get('/excel', function(req, res) { 

var locationSpread = ['location1.xlsx', 'location2.xlsx', 
'location3.xlsx']; 

locationSpread.forEach(function(filename) { 
fs.unlink("./Spreadsheets/" + filename, (err) => { 
    if (err) { 
    console.log('Spreadsheet ' + filename + ' not found'); 
    } else { 
    console.log('Spreadsheet ' + filename + ' successfully found'); 
    } 
}); 

var query = connection.query('SELECT * from ' + filename.slice(0, -5), function(err, rows) { 

    var workbook = excelbuilder.createWorkbook('./Spreadsheets/', filename); 
    var sheet = workbook.createSheet(filename.slice(0, -5), 3, rows.length); 
    sheet.set(1, 1, 'First Name'); 
    sheet.set(2, 1, 'Last Name'); 
    sheet.set(3, 1, 'Company'); 

    *** TROUBLE CODE START HERE *** 
    for (var j = 2, z = 0; z < rows.length; j++, z++) { 
    sheet.set(1, j, rows[z].firstName); 
    sheet.set(2, j, rows[z].lastName); 
    sheet.set(3, j, rows[z].company); 
    } 
    *** TROUBLE CODE END HERE *** 

    workbook.save(function(err) { 
    console.log('workbook saved ' + (err ? 'failed' : 'ok')); 
    }); 
}); 
}); 
}); 

Das erste, was ich tun ist, um die Dateien löschen, wenn sie Tabellen im Ordner vorhanden ist. Dann frage ich die Datenbank basierend auf dem Standort ab. Ich erstelle eine neue Arbeitsmappe und ein Arbeitsblatt und schreibe darauf. Die for-Schleife bricht das Programm und während der Fehler ist:

TypeError: Cannot read property '1' of undefined 

Ich glaube, es ist etwas entlang der Linien von Asynchron

+0

Wo verwenden Sie Async? Sind Sie sicher, dass es nicht die Zeile 'sheet.set (1, ...' die Ursache des Fehlers ist? Können Sie den aufrufenden Stapel der Ausnahme posten? – lilezek

+0

Der Fehler kann hier eingesehen werden: https://pastebin.com ./gKpBvUQx Aber im Grunde, wenn ich innen ohne die for-Schleife diesen Code auszuführen waren, es funktioniert perfekt – NodeJSNoob

Antwort

0

Eine mögliche Fehler, den ich hier sehe, ist, dass Sie von der Asynchron-Version verwenden von unlink. Wenn die Datei beim Versuch, das Arbeitsbuch zu erstellen, nicht gelöscht wurde, kann möglicherweise ein Fehler auftreten.

Sie können versuchen, zu unlinkSync Schalt- und Verifizieren, dass das Objekt nicht workbook null ist ein Blatt vor dem Erstellen (und als zusätzliche Vorsichtsmaßnahme, dass das sheet Objekt vor Einstellwerten nicht null ist).

Darüber hinaus ist es unmöglich, ohne Ihren Fehler Stack weiter zu helfen.

+0

zu unlinkSync Ändern verursacht die Anwendungsfehler einen Fehler ausgibt: ENOENT: keine solche Datei oder das Verzeichnis, entkoppeln I don so‘ denke, dass der Fehler verursacht hat, da unlink tatsächlich funktionierte und fing den Fehler auf, als es geworfen wurde. Der Fehler kann hier gesehen werden: https://pastebin.com/gKpBvUQx Aber im Wesentlichen, wenn ich diesen Code ohne das for ausführen sollte Schleife innen, es funktioniert perfekt. – NodeJSNoob

+0

Eigentlich tha Das könnte Ihre Ursache sein: 'unlinkSync' macht genau das gleiche wie' unlink'. Wenn das Löschen der Datei fehlschlägt, bedeutet dies, dass die Datei nicht vorhanden ist. Überprüfen Sie, ob es vor dem Löschen vorhanden ist. –

0

So war der Fehler wegen eines Fehlers einer ersten Einrichtung. Grundsätzlich hat das createWorkbook eine anfängliche Anzahl von Zeilen und Spalten und wenn Sie versuchen, einen Wert zu schreiben, der außerhalb der Grenzen dessen liegt, was Sie ursprünglich erstellt haben, wird ein Fehler ausgegeben. Daher stürzte meine for-Schleife immer weiter ab.