小弟的規劃表 - http://blog.kerkerj.in/blog/2014/11/01/planning/
好讀版 - http://blog.kerkerj.in/blog/2014/10/19/api-d19/
昨天先把專案目錄初始化,裝完該裝的套件後
在 routes 中加入一個 index.js 檔案
'use strict';
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.status(200).json({ greetings: "hello world!"});
});
module.exports = router;
建立一個 app.js 在專案根目錄中:
app.js
var express = require('express');
var app = express();
var index = require('./routes/index');
// Set routers
app.use('/', index);
module.exports = app;
然後在 bin 資料夾建立一個 server.js:
bin/server.js:
'use strict';
var debug = require('debug')('TODOAPI');
var app = require('../app');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
並且在 package.json 中修改並加入:
加入 start : "start": "node ./bin/server.js",
"scripts": {
"start": "node ./bin/server.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
這樣我們就可以透過 npm start 來啟動 server 了!
試著啟動看看 npm start
到網址列輸入 http://localhost:3000/
就可以看到 {"greetings":"hello world!"} 了!
我們從本文的後面往回看:其實就是一個 request 會經過的地方:
當我們下了 npm start,npm 會搜尋 package.json 中有沒有 start 指令
若有的話就會執行他所設定的指令 node ./bin/server.js
這樣就會執行 server.js 了
我們再看一下 server.js,講解在底下的註解:
// 使用嚴格模式
'use strict';
// 加入 debugger
var debug = require('debug')('TODOAPI');
// 將我們寫的 app.js 引入,建立一個 app instance
var app = require('../app');
// 設定 app instance 的 port, 若環境變數有設定的話就使用環境變數的值
// 沒有設定環境變數的話則是 3000
app.set('port', process.env.PORT || 3000);
// 啟動 server,讓 server 監聽剛剛上一行所設定的 port,
// 並且使用 debugger
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
既然 server.js 啟動了一個 app.js 的 instance
那我們就要來看一下 app.js
// 引入 express 模組
var express = require('express');
// 初始化一個 express instance
var app = express();
// 將 route 引入
var index = require('./routes/index');
// 設定若有 request 進到 http://localhost:3000/ 時,
// 交給 routes/index.js 來作後續處理
app.use('/', index);
最後這一行是這個檔案 export 成一個模組
module.exports = app;
那現在我們瞭解到了,如果有一個要求打進了 http://localhost:3000/
它會將該要求轉發給 routes/index.js 來作處理
因此我們再進到 index.js 看看內容
// 使用嚴格模式
'use strict';
// 引入 express 模組
var express = require('express');
// 在這邊我們要使用 express 模組中的 Router
// 因為在 app.js 中,若是使用 app.use('/', index)
// 該 index 物件必須是一個 Router 物件,
// 因此在這邊我們才會這樣寫
// 於是 router 就是一個 express 的 router 物件了
var router = express.Router();
// 設定該 router 有哪些路徑要來聽
// 在這邊我們設定當有 request 進到 根目錄,
// 且是使用 GET 方法時,我們的回覆是:
// HTTP status code 為 200
// 回傳的資料為 json 格式,傳入的內容是一個 javascript 物件
// .json 方法會幫我們轉成 json 格式回傳給使用者
router.get('/', function(req, res) {
res.status(200).json({ greetings: "hello world!"});
});
// 最後將這個檔案 export 成一個 router 模組
module.exports = router;
所以透過這樣的方式我們就瞭解到了一個 request 是如何在模組化後的程式奔跑遊走
另外要特別提到的是 http status code
http status code 其實是一個非常好讓 client 知道這次 API request 發生什麼事的資料,充分利用 HTTP 協議所定義的狀態碼
我們有時候瀏覽網頁會看到: 404 Not found! 或是 500 Internal Server Error
這就是 HTTP status code
那我們可以透過定義好回傳的 http status code 來代表此次 request 的狀態
例如:
client 端輸入的 API 網址錯誤了
我們就回傳 status code: 404
如果是不小心 server 的 code 寫錯了,導致該次 request 完全讓 server 死掉了,
那就可以回傳 500 interanl server error
因此在做 error handling 時,請定義好 status code,他一定會有幫助的!
常用的 status code:
200 - Success
201 - Created
400 - Bad request
401 - Unauthorized
403 - Forbidden
404 - Not found
500 - Internal Server Error
詳細還可以參考: HTTP status code