2017-07-23 94 views
0

我想創建一個使用excelbuilder的excel工作簿並使用來自mysql數據庫的信息填充數據。這是我的get方法:異步節點JS查詢連接

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')); 
    }); 
}); 
}); 
}); 

我做的第一件事是,如果他們的文件夾中的電子表格存在刪除這些文件。然後我根據位置查詢數據庫。我創建一個新的工作簿和工作表,然後寫入它。 for循環打破了計劃,而錯誤是:

TypeError: Cannot read property '1' of undefined 

我相信這是一起異步線的東西

+0

你在哪裏使用異步?你確定它不是行'sheet.set(1,...'錯誤的原因嗎?你能發佈異常的調用堆棧嗎? – lilezek

+0

錯誤可以在這裏看到:https://pastebin.com 。/ gKpBvUQx 但基本上如果我沒有在for循環中運行這些代碼,它完美 – NodeJSNoob

回答

0

一個可能的錯,我在這裏看到的是,你正在使用的異步版本unlink。如果在嘗試創建工作簿時文件未被刪除,可能會發生錯誤。

您可以嘗試切換到unlinkSync並驗證在創建工作表之前workbook對象不爲空(並且作爲額外的預防措施,在設置值之前sheet對象不爲空)。

除此之外,沒有您的錯誤堆棧是不可能的。

+0

更改爲unlinkSync導致應用程序錯誤輸出錯誤:ENOENT:沒有這樣的文件或目錄,取消鏈接 所以我不。覺得既然取消鏈接實際工作,並抓住了錯誤,當它被拋出導致錯誤 可以在這裏看到的錯誤:https://pastebin.com/gKpBvUQx 但基本上如果我要運行此代碼,而不爲循環裏面,它完美的作品。 – NodeJSNoob

+0

其實,塔t可能是你的根本原因:'unlinkSync'和'unlink'完全一樣。如果刪除文件失敗,則表示文件不存在。在嘗試刪除之前檢查它是否存在。 –

0

所以錯誤是由於初始設置的錯誤。基本上,createWorkbook具有最初的行數和列數,如果您碰巧試圖寫出超出您最初創建的範圍的值,則會引發錯誤。因此,爲什麼我的循環不斷崩潰。