第一次寫node項目,以前除了前端的腳手架構建接觸過一些簡單的,因此老是碰到不少坑。好比權限驗證,好比異常處理,好比日誌管理。
在看log4js使用方法的時候忽然想到本身就能夠實現簡單的業務,不須要藉助組件,雖然簡單可是實現了挺開心的。前端
本身的node項目寫了一段時間了,但一直沒有加上日誌管理的功能,由於以爲不必,不少時候都是在本身電腦上面調試的。
但忽然有一天在線上訪問本身的項目,發現頁面報錯了,想知道爲何報錯了,發現居然沒有什麼很好的方法,若是我沒有經過一個東西去記錄的話,因此日誌管理這個時候就顯得尤其重要了。node
檢查路徑是否存在git
建立目錄的方法github
讀取文件的方法sql
寫入文件的方法json
個人業務是定義了兩個類型,錯誤和sql,而後傳入日誌內容服務器
/** * 寫入日誌 * @param {String} type // 日誌類型 err 錯誤日誌 sql sql日誌 * @param {String} content */ writeLog (content, type = 'err') { // 建立不存在的文件夾 await this.dirExists(`log/file/${type}`) // 獲取到文件files fs.readFile(`log/file/${type}/${utils.switchTime(new Date(), 'YYYY-MM-DD')}.log`, (err, data) => { if (err) { console.log(err) } // 寫入文件 fs.writeFile(`log/file/${type}/${utils.switchTime(new Date(), 'YYYY-MM-DD')}.log`, `${data || ''}\n${content}`, async (err) => { if (err) { console.log(err) } }) }) }
function query (sql) { // 寫入sql NodeLog.writeLog(sql, 'sql') return new Promise((resolve, reject) => { pool.getConnection((err, conn) => { if (err) { // 若是是鏈接斷開,自動從新鏈接 if (err.code === 'PROTOCOL_CONNECTION_LOST') { setTimeout(query(), 2000); reject('斷開重連'); } else { console.error(err.stack || err); reject(err); } } else { // 獲得結果 conn.query(sql, (queryErr, result) => { if (queryErr) { reject(queryErr); } else { resolve(result); } // 釋放鏈接 conn.release(); }) } }) }) }
handleException (req, res, e) { // 寫入日誌 NodeLog.writeLog(e) res.json({ code: e.errno || 20501, success: false, content: e, message: '服務器內部錯誤' }) }
日誌完整代碼架構