接下來這篇就會比較偏 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

Github 參考 接著我們要根據我們開之前寫好的 文件 來開發: 要有下列 routes TODOs GET /user/{user_id}/todos/ POST /user/{user_id}/todos/ GET /user/{user_id}/todos/{id} PUT /user/{user_id}/todos/{id} DELETE /user/{user_id}/todos/{id} 這樣的需求其實可以用 namespace 實作,不過我們偷懶一點,直接指向 /user 就好 所以在 app.js 加入 var users = require('./routes/users'); app.use('/user', users); 所以會變這樣: var express = require('express'); var app = express(); // Set routers var index = require('./routes/index'); var users = require('./routes/users'); app.use('/', index); app.use('/user', users); module.exports = app; 不過看起來我們缺少 routes/users.js,所以我們也來新增一個 routes/users.js 內容如下 'use strict'; var express = require('express'); var router = express.

Continue reading

Author's picture

kerkerj

Cat lover <3

Backend Engineer

Taiwan