第一次寫node項目,以前除了前端的腳手架構建接觸過一些簡單的,因此老是碰到不少坑。好比權限驗證,好比異常處理,好比日誌管理。 在看log4js使用方法的時候忽然想到本身就能夠實現簡單的業務,不須要藉助組件,雖然簡單可是實現了挺開心的。前端
本身的node項目寫了一段時間了,但一直沒有加上日誌管理的功能,由於以爲不必,不少時候都是在本身電腦上面調試的。 但忽然有一天在線上訪問本身的項目,發現頁面報錯了,想知道爲何報錯了,發現居然沒有什麼很好的方法,若是我沒有經過一個東西去記錄的話,因此日誌管理這個時候就顯得尤其重要了。node
檢查路徑是否存在git
建立目錄的方法github
讀取文件的方法sql
寫入文件的方法json
個人業務是定義了兩個類型,錯誤和sql,而後傳入日誌內容bash
/**
* 寫入日誌
* @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: '服務器內部錯誤'
})
}
複製代碼
日誌完整代碼服務器