Photo by Towfiqu barbhuiya on Unsplash

一、為何會選擇這個專案?

理財的第一步,就從記帳開始。良好的記帳習慣能夠讓自己清楚的知道每日的各項開銷,對於未來的預算規畫至關重要,記帳的過程中,也能夠了解自身的消費習慣,找出不必要的花費,一個看似不起眼的動作,也許是引領自身走向財富自由不可或缺的一環。因此我選擇了此項專案,一方面除了自己能夠實際使用之外,另一方面也可以讓自己思考,怎麼樣的功能可以幫助使用者建立一個良好的記帳習慣。

二、使用了什麼技術?

開發此專案,運用了 Node.js 作為前端與後端的溝通橋樑,並且使用 Express.js 來架構整個網站的路由,以 MongoDB 作為主要資料庫的使用,另外也使用 Passport.js 來實現使用者註冊、登入和登出的功能,也串接了 Facebook 的第三方登入功能,讓使用者能夠更輕鬆的註冊與登入。

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

開發的過程中,對於路由的規畫較能掌握,對於資料操作方面,像是取得 client 端資料,以及將這些資料整理過後,存入資料庫的過程也相對熟悉。

在前端的畫面呈現上則是花費了較多的時間來調整,主要是對於 bootstrap 的使用上還不夠熟悉,在來就是對於排序分類的功能,在畫面呈現以及資料庫的操作邏輯方面,花費了不少時間來思考,最後則是登入系統的實作部分。

四、過程中碰到什麼困難?又如何克服?(例如:查找網路文件)

過程中,我一直在思考,有沒有方法能夠讓密碼的雜湊以及驗證更加的簡便,後來發現了 Passport.js 的相關套件,也就是 Passport-local-mongoose,這個套件提供了許多內建的方法,像是 authenticate(),就是針對 passport.js 中 LocalStrategy 所使用的方法,還有 serializeUser() 以及 deserializeUser(),另外 register() 則包辦了使用者註冊後,密碼的雜湊和寫入資料庫的功能。

想特別提一下 authenticate() 這個方法,這個方法的預設 usernameField 是 username ,因此登入時會驗證 username 和 password ,但我想要做的是 email 認證,所以一開始使用這個方法時,並沒有辦法順利的登入,後來仔細閱讀 README 後才發現,這個套件有另一個方法可以客製化 Strategy,也就是 createStrategy() ,在嘗試將 user model 中的 usernameField 改為 email 後,再搭配 createStrategy() ,就成功將問題解決了。

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

整個專案中,對於 passport 相關套件使用印象較深刻,一方面是因為使用了新的套件( Passport-local-mongoose),另一方面也是因為對註冊、登入這部分的建構和運用還不太熟悉,所以也花了較多的時間查資料和思考。

--

--

Photo by James Harrison on Unsplash

一、緣起

最初在著手開始寫程式碼前,有參考了許多網路上短網址生產器的網站,觀察這些網站有提供甚麼樣的功能給使用者,以及嘗試了許多狀況來測試這些網站,其中測試的一種狀況是:

「當使用者輸入的網址無效時,是否會提醒使用者?」

結果是有些網站會提醒使用者,有些則不會。而我在思考過後,覺得這項功能雖然不是很起眼,但對於使用者體驗應該是有正面影響的,對於後端資料庫來說也可以避免儲存無用的資料,因此決定在我的實作中加入這個功能。

二、最初採用的做法

一開始我是使用 Node.js 中內建的模組 dns.lookup 來實現這項功能,以下為 Node.js 文件對於 dns.lookup 的描述:

dns.lookup(hostname[, options], callback)

將主機名(例如 'nodejs.org')解析為第一個找到的 A (IPv4) 或 AAAA (IPv6) 紀錄。 所有 option 屬性都是可選的。 如果 options 是整數,則它必須是 46 – 如果未提供 options,則如果找到,则返回 IPv4 和 IPv6 地址

會選擇這樣做的主要是因為這是 Node.js 內建的,當時也並沒有考慮到要另外下載 npm 的相關套件來使用。

而在我寫好程式碼後,再測試這項功能時發現,當我拿同樣的無效網址進行重複測試時,有時候可以正確的跳出 error 頁面,有時卻不會,當時對於這個問題實在是百般不解,也在這卡了大半天。

三、定義問題

我認為問題是出在使用 dns.lookup 這個方法,在多次上網查詢原因後,仍然無法找出解決方法,於是我放棄了這個方法。

四、尋找與嘗試

後來開始上網搜尋能夠辨別網址是否有效的方法,也發現了似乎有許多 npm 套件都有提供這樣的功能,於是我選擇了其中一個名為 「got」的套件來嘗試解決我的問題。

在瀏覽 got 的 readme 後,頁面上是這樣描述 got 的:

Human-friendly and powerful HTTP request library for Node.js

雖然研究了好一陣子,但還是不太能理解 got 套件主要可以用來解決甚麼問題,不過無庸置疑的一點是,它確實可以解決我目前遇到的問題,就是辨別「網域是否有效」。

五、回顧

回顧整個過程,感覺是誤打誤撞才解決問題的,也再次了解到自身的不足,也許最初的 dns.lookup 能夠確實辨別網域是否有效,但因為我對於這項工具並不十分了解,所以最終選擇放棄而改選其他解決方案,但經過這次的經驗,也讓我明白到 npm 套件的強大,自己怎麼想破頭都無法解決的問題,在利用合適的套件後,問題就輕鬆的迎刃而解了。

--

--