[自學紀錄] 手刻Cookie-based 憑證機遇到的問題與解決過程

Ivy Hung
Feb 8, 2021

--

在餐廳清單的作業中,為了實作Cookie-based 憑證交換功能,保存使用者登入狀態,開啟一連串的找資料的過程。

實作前的摸索

首先,我透過作業的說明搞懂 cookie 和 session 的差別:Cookie 是在瀏覽器裡的儲存空間,而 Session 是在伺服器裡的儲存空間。 接著,我開始搜尋怎麼設定及讀取 cookie 和 session,發現有多種方法,其中利用 cookie-paeser 或 express-session 套件最方便且安全。

撇開安全性問題,因為這次作業是為了手刻憑證交換機制,所以我盡量不使用第三方套件,接下來就要用最人工的方法來實作了。

第一次出手與失敗

搜尋到 Sending and Receiving Cookies from Express.js 這篇教學之後,因為他也沒使用套件,所以我決定照著他的教學做一遍。做到一半後發現這個教學不符合我的專案,因為他是在使用者第一次到達網頁時就記錄 cookie,而我是想要在使用者登入後再紀錄,所以就打掉重練……

首先我在使用者成功登入後,使用 res.cookie(‘userId’, value) 設定 cookie,並建立 sessions 變數將使用者資訊用 sessions[userId] = { userInfo… } 的方式儲存在伺服器裡。

再來,我新增一個 getUserId function,用 res.header.cookie 的方式取得 cookie 資訊後,再用 split 的方法來拆解 cookie 取得 userId。接著在路由(home.js & restaurants.js)皆新增一個 middleware 使用 getUserId function,如果先前有設定 cookie 就會取得 userId。

前面的步驟順利完成,但在試圖取得 sessions 中的資料時遇到一個問題:由於我將 sessions 變數建立在 home.js 的檔案裡,所以我無法在其他檔案取得這個變數。

定義問題

原本在 home.js 的檔案裡就有用 module.exports 匯出路由,因此我再用一次 module.exports 想匯出 sessions 時無法執行。那有沒有其他辦法可以一次匯出多個變數呢?

尋找與嘗試

搜尋資料後看到 關於 module.exports 的兩三事 這篇文章,才發現其實module.exports 是個特別的物件,因此我試著使用 module.exports = { home, sessions } 匯出兩個變數,就成功在其他檔案取得 sessions 了。

回顧與發現

其實我一直都會使用 module.exports 來匯出變數,但因為我只是跟著課程的教學做,而之前都只有匯出過一個變數,導致我遇到要匯出兩個變數的時候就卡住了。幸好透過搜尋順利解決問題,透過這次經驗,也讓我學到會使用一個語法與真正深入了解他的差別,之後再學習時要更加謹慎!

最後附上此次實作的程式碼:https://github.com/ivyhungtw/Restaurant-List/commit/01db501fbeecf323e8180be64f07a1279a1f053a

資源分享

Sending and Receiving Cookies from Express.js https://alligator.io/nodejs/express-cookies/

關於 module.exports 的兩三事 https://ithelp.ithome.com.tw/articles/10185083

--

--

No responses yet