[API-d30] - 總結

總結三十天下來的 Restful API service 建置 其實接觸到的東西很廣泛 從 server 端到程式端,還有虛擬機器的使用都有沾到邊 其實不管是哪個領域都是要一點一滴累積起來的 以這次的開發技術來說, vagrant 方便在於我在和別人共享 server 環境時非常方便 自己在架測試環境時也可以先將乾淨的 web serser 打包起來 供日後隨時要用時開起來馬上 deploy 就可以使用 另外加上方便的網路設定, 在測試時非常方便 另外則是 nodejs, 這次會選擇 nodejs 主要也是想進入 javascript 的世界 nodejs 若作為一個後端程式語言來說,我認為是非常輕量且入門非常簡單 套一句最近常聽到的話 javascript is everywhere 不管是網頁前後端,nodejs 還可以拿來寫桌面應用、嵌入式系統 應用領域非常廣泛 也希望這門語言能夠更標準化,擺脫歷史包袱 看最近幾年的發展,其實我認為是勢在必行的 只缺一個領頭羊來帶領大家前往偉大的航道了! XD 希望三十天的分享能給大家帶來不一樣的感受~ 對了突然想到一件事,這個主題的副標最後一句是想要和 APP 結合 APP 在隔壁棚啦 XD

Continue reading

接下來這篇就會比較偏 server 設定了! nginx 是一套伺服器軟體,和 apache 並駕齊驅 (其實我覺得 nginx >>> apache XD) 主要是 nginx 清量快速 我們要拿他幫 nodejs 處理接收 request 的部分,再將 request 導往 nodejs 所以感覺就會如下圖: 可以讓 nginx 當作是 load balancer, 透過 reverse proxy 的方式轉發 request 給 nodejs, 讓 nginx 承受流量 這就是我們今天要做的事情, 所以首先,我們就要先裝 nginx,因此就先進虛擬機吧! $ sudo apt-get update && sudo apt-get upgrade -y $ sudo apt-get install nginx 這樣就會安裝一個 nginx 了! Nginx 的設定檔都是放在 /etc/nginx/ 底下 個別網站的設定放在 /etc/nginx/sites-available 如果要讓該網站上線,則會將 /etc/nginx/sites-available 的設定檔 link 到 /etc/nginx/sites-enable

Continue reading

Github 參考 接下來兩天要講 deploy 的部分 由於 deploy 的 script 其實非常的麻煩,因此我們就不提 deploy 的 script 了 我們只專注在 server 上需要什麼東西 今天要來看看 forever 這個套件 這個套件可以幫助 nodejs 的 server 遇上無預警的 server 掛掉時 會幫你自動重新啟動 nodejs 的 server 也就是說 假設說 nodejs 寫的 server 某個 route 有問題, 送 request 後會因為某些因素造成 server error 造成程式碼 crash 時 forever 的 monitor 會偵測到,並幫你自動重啟 server 至少不會造成其他正常存取 server 的使用者遭遇到 server down 的問題 這個套件可以選擇裝在 global 或是 project 在這邊我是選擇裝成 global 進到虛擬機 $ npm install -g forever p.

Continue reading

Github 參考 log 處理 今天要來談談 log 的處理, 身為一台自走 (?) node.js API server 也應該要記錄一下 request 的 log 呀! 不然哪天出問題了都不知道是哪個 request 把 server 搞掛了! 因此我們就要加入 log 的 middleware node.js 的 log 套件也蠻多的, 例如 winston 不過我們今天要用的是 log4js 會選擇他其實也只是因為之前寫 java 有用過 log4j log4js 的設定感覺起來比較相似 所以就使用它了! 再來我們就安裝一下 log4js 吧 $ npm install log4js -save 並在 app.js 中 require 進去 var log4js = require('log4js'); 接著在 app.js 的前面區段加入以下程式碼: log4js.configure({ appenders: [ { type: 'console' }, //控制台輸出 { type: 'file', //文件輸出 filename: 'logs/access.

Continue reading

Github 參考 假設今天我們的 API 上線了,可能就會面臨到一些問題, 例如說,任何人都可以存取我們的 API 當然我們不希望任何人都可以存取, 因此我們必須加一點驗證機制在裡面, 其中一種做法是使用 Oauth token 在拿 API 資料前,先向 Oauth server 要一個 token Oauth Server 認可身份後即會核發一個 token 給 client 端 該 token 具有時效性,6 mins ~ 30 min 不等,看怎麼實作 接著 client 端就拿該組 token 以及 API url 對 resources server 丟 request 其實我們現在在做的 API server 就是一個 resources server 因為我們提供資源 而 resources server 就會先認 token, 確保該 token 的時效性以及正確性,以及該 token 可存取的資源範圍 確認無誤後再回送正確的資料 不過在這邊我們並沒有要實作 Oauth Server 單純以一個 resources server 而言,只要認 token 是否正確

Continue reading

Github 參考 不知道大家在用 POSTMAN 對前幾天寫的 API 丟 request 有沒有遇過類似下面的情況: Cannot GET /user/kerkerj/todoss 通常是丟錯網址時會出現的,或是 code 沒寫好會出現 500 error 這些情況是有辦法接到的,今天我們希望能夠接到後,將 message 轉成 json 格式吐回給 client 因此程式碼如下 app.js // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; res.status(404).jsonp({error: "Not Found"}); next(); }); // catch 500 app.use(function(err, req, res, next) { res.status(err.status || 500).json({error: err.message}); }); 基本上這兩段 code 的意思就是加入了兩個 middleware

Continue reading

Github 參考 還記得昨天說要偷懶一下嗎 XD 因為刪除真的很簡單! 我們前面走過了新增、修改、讀取了 刪除?哪有什麼困難的呢! XD 直接看 code 吧! routes/users.js: // Delete a todo task router.delete('/:user_id/todos/:todo_id', function(req, res) { var user_id = req.params.user_id; var todo_id = req.params.todo_id; TODO.remove( { _id: todo_id, user_id: user_id }, function (err) { if (err) { res.status(400).json( { error: "delete data error"} ); } else { res.status(201).json( { success: "true" } ); } } ); }); 非常的簡單! 先抓到 user_id, todo_id 後 使用 .remove 的方法,下 WHERE 條件,並在 callback 作處理

Continue reading

Github 參考 接上篇,我們已經可以拿到 todo list 了 也可以拿到特定的 todo task 再來我們就可以編輯特定的 todo task 了對吧? 不囉唆直接進入程式碼 routes/users.js // Update a todo task router.put('/:user_id/todos/:todo_id', function(req, res) { var user_id = req.params.user_id; var todo_id = req.params.todo_id; var data = req.body; TODO.update( { _id: todo_id, user_id: user_id }, { $set: { content: data.content } }, function (err, num, raw, results) { if (err) { res.status(400).json( { error: "update data error" } ); } else { TODO.

Continue reading

Github 參考 如果有使用 MongoDB client 的話就可以搭配使用會比較有感覺 Mac 我是使用 Robomongo,算很好上手~ 今天要來實作讀取的部分 讀取有分兩種,一種是讀取 list 另一種是讀取特定某個 todo task,今天兩種都會實作 首先我們先實作 get todo list 因為若要拿到特定的 todo task,需要 todo task 的 id 而我們現在還不曉得 todo task 的 id 是多少,我們只知道 user_id 因此就先從 list 下手 routes/users.js: // Get todo list router.get('/:user_id/todos', function(req, res) { var user_id = req.params.user_id; TODO.find( {user_id: user_id}, function (err, results) { if (err) { res.status(400).json( { error: "can not find data" } ); } else { res.

Continue reading

Github 參考 昨天我們了解了如何拿 url params 以及 request data 今天我們就來使用他,對資料庫做存取 由於使用到資料庫,因此我們要加入資料庫的 driver 我們用的是 mongoose 套件 app.js: // 在最上方加入 var mongoose = require('mongoose'); // 在某個地方連接資料庫 var db_uri = "mongodb://192.168.33.10:27017/TODOs"; mongoose.connect(db_uri); 在這邊我是使用了虛擬機的 DB,因此是 mongodb://192.168.33.10:27017/TODOs DB 的名稱為 TODOs 這樣在程式一跑起來時,就會連接資料庫了! 再來我們就要設定在對資料庫做 CRUD 時,所需要做的事情 首先我們先要定義 schema, 雖然 mongodb 是 schema-free,但是官方文件也有提到最好還是有固定的 schema 避免記憶體 allocate 時出現問題,而程式撰寫時邏輯也不會因此而過於複雜 這時候我們就需要 model 資料夾了,在 model 資料夾中新增一個 todos.js 裡面要放的就是 todo task 的 schema 內容如下: models/todos.js: 'use strict'; var mongoose = require('mongoose'); // Define our todo schema var TODOschema = new mongoose.

Continue reading

Author's picture

kerkerj

Cat lover <3

Backend Engineer

Taiwan