你為何會選擇這個專案?

記帳軟體很好地體現了 CRUD 四個操作,例如新增一筆記帳、查看記帳內容、修改記帳、刪除記帳,這些都是日常生活中實際記帳時會發生的。
工程師的職責就是將現實中的行為轉換為一行行的程式碼,再把他們連結起來變成能夠運作的軟體,試著。

你使用了什麼技術?

這個專案的開發環境是 Node.js 搭配 Express,作為一個初學者,在理解基本前端開發的情況下,使用熟悉的語言及架構是再好不過了:使用 JavaScript 一種語言打通前後端,再搭配 express-handlebars 作為 Template Engine,其結構與 HTML 相同且有許多好用的 helpers 可以使用。

資料庫使用 MongoDB,它屬於 NoSQL,也是目前使用者最多、生態系最完整的文件資料庫 (document database)。實務上搭配 ODM 如 Mongoose ,便可使用包裝過且更高階的語法來操作資料庫,增加程式碼的易讀性與維護性。

哪部分你相對能掌握?哪裡花了最多時間?

我已經能夠掌握的是:

  • 以 MVC 架構展開專案,實現關注點分離
  • 前端畫面切版搭配 Bootstrap 美化,RWD 符合 Mobile First
  • CRUD 基本功能實作結合Restful 路由設計

花費最多時間的是:

  • 登入功能
  • 篩選功能
  • 金額格式化(加上逗點)

過程中碰到什麼困難?又如何克服?

  1. 登入功能
    登入功能使用 passport.js 來實作,過程中遇到需要在 callback 函式中使用 req 搭配 connect-flash 來顯示提醒訊息的狀況,查閱文件後發現可以加入passReqToCallback: true這個屬性來解決。
  2. 篩選功能
    篩選功能實作需要使用 aggregate 的多個語法搭配: $match$group$sum$project,但在過程中發現 Schema 設定的資料 type 不對,導致資料庫一直撈不到資料或是出現錯誤,例如:無法用$sum執行加總,因為金額的 type 要是 Number;無法抓到同個月份的資料,因為日期的 type 要是 Date
    這些資料型別的問題其實在 MongoDB 文件的 Behavior 有寫,只能怪自己經驗不夠,未來要先確認資料型別,免得花很多時間在找已經寫在文件上的問題。
  3. 金額格式化(加上逗點)
    格式化的功能使用正規表達式來實作,每次使用正規表達式都覺得像是在查字典然後造句,看這本字典本身不困難,但要造出想要的句子很困難,最後是找了許多網路資源才拼湊出來。

過程中你有對哪個技術有特別深刻的學習?

這絕對是篩選功能了,這個看起來很簡單的功能,其實需要花費一番功夫:要先上網查怎麼用 MongoDB 做篩選功能,縮小語法範圍之後去看官方文件寫的語法使用方式,同時也找別人分享的實務寫法;自己第一次寫一定會有問題,所以先寫基本功能,像是用$match撈出該 user 的資料,確定不會撈到別人的,再繼續往下寫$group讓資料分組、依據日期分組等等,這樣在除錯時會比較有效率。

操作資料庫感覺很奧妙,可以使用多個語法組合,得到想要的結果,有點像玩樂高積木,積木就是那些,每個人都可以組出自己想要的樣子。經過這個專案也再次深刻地感受到閱讀文件的技能相當重要,官方文件就像一本字典,不可能直接從第一頁讀到最後一頁,先把問題拆解後再用關鍵字去搜尋,會比較有效率。

這個專案有部署到 Heroku,可以使用 facebook 或這兩組帳號登入

完整的程式碼可以在我的 GitHub 查看,喜歡的話歡迎 Fork 並幫我按個 Star 吧!

--

--