套件組合技經驗:JSON Server

前陣子因為在開發環境需要有個簡易又不會太粗糙的 mock server,所以快速用短短的時間把幾個套件組合串起來,成為基本可用的迷你 project,最主要還是拜豐富 NodeJS 的生態系所賜,很多東西都有現成可用幾乎不用多寫幾行程式碼,原則上就是可以推到開發環境。 一開始先找到最熱門的 json server 就是 typicode 的專案,跑起來基本上已經符合需求,所以從這邊開始來組合。 如果是用程式碼方式建立 json server 來做客製化,其實骨子裡就是 express web framework,所以用法都是一樣: const https = require("https"); const devcert = require("devcert"); const jsonServer = require("json-server"); const server = jsonServer.create(); server.use(jsonServer.defaults()); server.use(jsonServer.rewriter(require("./routes.json"))); server.use(jsonServer.router("api.json")); async function start() { let ssl = await devcert.certificateFor("api.dev"); https.createServer(ssl, server).listen(8443); } start(); 開發環境希望也是走 HTTPS 方式所以用到 devcert 掛了一個自簽的開發用憑證就可以跑 HTTPS 了,如上幾乎就是開箱即用的 server。 由於需要 db.json 檔裡面就是擺好被視為資料庫的 JSON 內容,然後依 request 的 HTTP method 進行資料的 CRUD,但也因為這個很棒的特性所以為了我自己的需求只好魔改原本程式變成 json-server-deformation。...

July 4, 2022 · Keanu Pang

Connect-Redis 套件更新 Session 過期時間的方式

在使用 Express 架設網站時,且因為 cluster 的考量,會將 Session cookie 的資訊往外拉,通常都是使用 Redis 來儲存使用者的 Session。在 Express 裡會透過 connect-redis 的套件來串接兩者,以及使用者登入的檢查就使用 passport 套件來幫我們完成。 在 Express 裡的設定結構大概會是這樣︰ let sessionMiddleware = session({ store: new RedisStore({ host: hostname, port: port, db: db * 1, ttl: 3600 }), resave: false, saveUninitialized: false }); app.middleware(‘session’, sessionMiddleware); 這時候的困難點會是當未登入的使用者可能需要 session cookie 的 maxAge 會比較短期,例如需要是處在 recaptcha 的驗證階段;直到使用者順利登入後,才需要更新 session cookie 的 maxAge 為合理的時間。也就是 Redis 的 TTL 設定是動態的方式調整。 參考這裡的 討論 的做法則會是固定將 TTL 設為 0,並在使用者登入後才更新 maxAge。所以 RedisStore 的設定將會是︰...

November 14, 2016 · Keanu Pang