# Node.js生出自己的記帳本 ## 為什麼會選擇這個專案 再完成Todo List後,剛從全端的角度學習了CRUD(增刪改查)的實作方式,希望能夠更多的練習,鞏固及驗證自己所學。 要掌握剛學習到的技術,不能一次跳級太多, 且程式的設計需要符合日常需求,因此選擇了內容比Todo List稍微豐富一點,日常生活亦常使用的記帳程式來作為本次專案的目標。 ## 使用的技術 本專案採用MVC分離式架構。 前端採用HTML/CSS/Javascript以及導入Bootstrap建立網站顯示頁面。 並且透過express-handlebars樣板引擎管理MVC中的V(View)。 後端在Node.js的環境下利用Javascript撰寫,主框架採用Express。 Node.js套件豐富,除了上述提到的express-handlebars。還根據需求載入下列套件。 * Mongoose: 作為一個ODM工具,很容易的溝通MongoDB與Javascript產生資料上的互動。 * method-override: 使路由設置更符合RESTful語意化架構。 * express-session & passport: 透過前者實作session,並用後者實現認證策略。 * bcryptjs: 雜湊產生使用者密碼。 ## 哪部分你相對能掌握?哪裡花了最多時間? 最能掌握的部份為最開始接觸的路由控制,以及MVC之間的互相呼叫與溝通。 最花時間的部分想當然耳是最新接觸的新技術。包含與資料庫的溝通以及認證系統。除此之外,時間篩選功能的建構抑是花費許多時間的地方。 ## 過程中碰到什麼困難?又如何克服? 1. 時間篩選功能: 本專案含兩種篩選功能,類別以幾月份。類別相對來說比記單純,直接透過資料庫篩選出類別相符的項目即可,但時間的篩選一開始碰上了一些障礙。因為必須透過月份篩選,因此必須要設定好條件的判斷,但最開始的Schema設定中,我將時間設定為String類別,造成要單獨拆出月份特別不直覺。後來上網參考其他人的討論後,發現可以設定為Date物件,即可使用javascript內建的函式取出對應的月份。且還因為函式中沒有加入return而花了一整天的時間尋找bug。深刻體會能力增長不代表不會遇到基礎的問題,打好基礎終歸是最重要的部分。 2. 認證系統: 包含session的設置,passport的認證判斷以及雜湊密碼的生成都是比較近期才學習到的新技術,在邊寫邊理解的過程上遇到滿多認知上的阻礙,時常需要完成一段內容後重新刪除,再次思考過後寫出一樣的功能才能確認自己初步的掌握程式的邏輯。 ## 過程中你有對哪個技術有特別深刻的學習? 最深刻練習的觀念還是屬於非同步莫屬。 特別是種子資料的建置,首次利用Promise.all去確保資料建立完成後才進行下一步。目前在理解時都會特別去思考這個功能式使用同步還是非同步。