安裝完成 nodejs 後選用一個工作目錄執行 npm init,npm 會產生一個 package.json 檔案,之後為此專案安裝套件時都會記錄在此,讓專案可以很容易的重建和移植,也可設定 npm start 執行時以哪一個 js 檔當作系統入口。直接開寫了,以下我用 app.js 當作系統入口。
前兩行引進兩個外部套件,express 為處理 request 和解析 routes 等 web 應用程式基本且必要的功能,body-parser 則提供將 request 傳入的資料解析成物件的功能,兩者都要透過 npm install 安裝。
sheetRoutes 為自行設計開發的 routes,內容將記在後面,看這 require 的用法真的非常優美。app = express() 意即用 app 當作最外層的整個應用系統物件,app.use() 裡面的參數預設是帶有 (request, response, next) 為參數的函數,所有函數的定位均為 middleware 接受 request,做一些處理並將回應加在 response,再呼叫 next() 傳到下一手,所以 use 可以非常多層。
以上所示第一層將 request 內容轉成物件,第二層處理 CORS 讓此服務可以讓別的網站呼叫,第三層就是處理自訂的 routes,此 routes 是以 sheet 開頭,分別導到不同的軟體元件處理。
接下來是 sheetRoutes.js,它的功能主要是識別 browser 的 url,其中 sheet/*** 後面接的網址對應到個別的 controller 相對單純,處理邏輯主要寫在 controller,可觀察此處的 export 寫法,export 甚麼,require 接到的就是甚麼,讓整個系統很容易的跨檔案分工。
再來是 controller,這兒乘載主要的邏輯,其中取得 google sheet 的邏輯再度切開到 sheetService 處理,document 的識別和認證放在這兒,必須在 google cloud platform 建立 service account,在預計存取的 google sheet 設定授權,並了解 document id and sheet id 等細節,網路已有許多人分享了就不再贅述。以下程式為經過摸索了解取回的 rows 物件,拆解其結構取出資料的可行方式。
先看最後傳回的 json 物件:每一個 row 物件經過 controller 的重組成為井井有條的 key vaue 形式,key 就是每一行的第一列。
原始的 google sheet 資料如下,記住要把第一行 freeze,取資料時才可有 key 為依據;顯而易見資料已經完美的轉換形式傳輸出去了。
最後看看在背後默默運行的 sheetService,其中引用了第三方貢獻的強大套件 google-spreasheet,我連 google 原始文件都沒 k 過,直接用套件真的是事半功倍。
最後我想把專案 deploy 到雲端正式提供服務,不知道會不會像 python 一樣一堆版本衝來衝去,非常擔心!結果令人欣喜,azure 神奇的自動把 https 也搞定了,nodejs 既然這麼友善,我想日後應該會越用越多吧!
By Newman Chen 2022/11/29
導覽頁:紐曼的技術筆記-索引 | Newman Home