---
# System prepended metadata

title: Node.js生出自己的記帳本

---

# 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去確保資料建立完成後才進行下一步。目前在理解時都會特別去思考這個功能式使用同步還是非同步。