整篇文章主要分成兩個部分。
第一個記錄的是部分是把 github 上別人提供的 hackathon-starter setup在 我們的 virutalMachine 上面的時候遇到的問題跟最後我們解決那些問題的 workaround。
第二個部分就著重在記錄說這兩天自己終於開啟了 Javascript 寫 backend api server 的小小小心得跟一些筆記。
簡單來說這次整個 hackathon 時間幾乎都花在了解 mean(? 的架構。
這次一開始就從 github 上面 clone 了個 “hackathon starter” 下來用。
安裝過程其實 github 裡面的 README.md 寫得很清楚這邊就不累贅了。
不過在安裝過程中出現了幾個小狀況讓我門的 express simple server(? 一直沒辦法成功 host 起來。
第一個遇到的問題跟這篇 blogPost 裡面作者描述的蠻類似的。簡單來說就是 "git remote rm origin" 之後要下 "npm install" 的時候就出現了一些 weird error,吐出來的 bug 有整萬行我也不知道該從哪裡看起。
Even 到現在我還是沒有辦法明確判斷說到底是什麼原因導致了這個問題的發生。而我最後的 workaround 就是照著上面 blogPost 里描述的在 "npm install" 之前先 "apt-get install node-legacy"。
第二個遇到的問題是 server 成功 Host 起來了,可是沒有辦法從外部 access 到 host 起來的 server。 這個部分導致這個問題發生的原因是因為說 和沛科技 提供的 virtualMachine 不是所有端口都有 default 開啟讓外部 access 的,所以可能要聯繫一下工作人員看要怎麼把外部的 Port Forward 到 virtualMachine 的 Port 上面。
我們第三個碰到的問題是沒辦法下 "npm install mongo-express" 安裝 "mongo-express",整體來說問題的敘述個這篇 blogPost 描述的很像。這個問題最後的 workaround 也是按照 Post 底下人家回答的,把一些對應的 library 補齊再試著安裝就 OK 了!
這裡開始就是關於自己這兩天對寫 Backend API Server 的一些隨筆。
如果就 hackathon-starter 這個資料夾的資料夾來看的話,可以發現說資料夾裡面最主要的東西不外乎就是一下這三個資料夾:
- models
- views
- controllers
還有 app.js 這個 js 檔。
app.js 是我們在 host server 的時候 nodejs 要去執行的 js 檔,角色有點類似 c 裡面的 main function,裡面記錄了說我整個 server 到底有哪些 API(? 可以讓你去 call。
models 資料夾裡面則是按照一個一個 object 去寫不同的 js 檔。 每個 js 檔裡面最主要要做的事情是去把這個 object 的 schema 定義好。schema 定義的內容基本上就是按照 database 裡面相關 collection 的資料結構。
底下例子中的 左邊可以看到 mongodb 裡面有一個 collection 叫 countryrequirements,而右邊對應的則是 models/countryRequirement.js 裡面怎麼定義這個 collection 的 schema。
看過了models, 接下來我們要看的就是 controller。 controllers/*.js 裡面要寫的東西其實就是某個object 的 GET啦,POST 啦,等等的 API。讓其他人可以透過 GET/POST hostname/myApi/myModal/ 來呼叫到 controllers/myApi.js 裡面 myModal 提供的 GET 或者 POST 或者其他function。
要注意的是 myApi.js 文件的一開始需要提到說 myModal 的schema在哪裡被 定義!
以下是我們這些自己定義的一下 API:
getTest 跟 postTest 分別是我們開放出來讓其他人可以透過 GET msia.ml/hackathon/Test ,或 POST msia.ml/hackathon/Test 取得特定資料的 API。而 getTest 裡面會用到的 User 這個 var 在一開始 Line 2 的時候就有明確指出說我 User 這個 schema 就是定義在當前路徑的 ../models/User.js 這個 檔案裡面。
除此之外,我們這次還有遇到一個蠻 annoying 的問題則是跟 database 裡的命名有關係。
因為這次題目的關係,我們的資料都是自己處理好之後手動用 "mongoimport" 這個程式去導入 database 。 在撰寫 API 要從資料庫獲取特定 collection 的時候其實會出現一個情況,就是 mongoose(or mongo? 似乎會有自己一套 "schema 對應 database” 的命名方式“。
舉個例子如果說 schema 的名字叫 countryRequirement,mongoose 會自己判斷說這個collection裡面應該有很多個筆 countryRequirements 格式的 document,所以 db 的名字不會叫 countryRequirement,而會叫 countryrequirements(*注1)。 Mongoose(*注2)這種會根據 schema 名字決定去哪個 collection 撈資料的特性會導致說如果 database 里 collection 命名的方式跟 schema 對應的名字不一樣的話會撈不出資料。
(*注1:db 的命名似乎也不會有 UpperCase )
(*注2:hackathon-starter 裡面預設用 mongoose)
底下在附上一些這次在寫 API 的時候找到的 references:
No comments:
Post a Comment