Github 參考

昨天先把專案目錄初始化,裝完該裝的套件後

在 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

其他教學