express搭建簡單的後臺伺服器(基礎篇)
本文簡單對express的一些重要基礎知識做一下記錄,以加深自己對express基礎的瞭解。
不得不說的路由
作為一個後臺伺服器,你必須要處理來自客戶端的各種請求。這個時候,就要先定義各種請求的處理器,也就是路由。
引用express官方的解釋。
路由是由一個 URI、HTTP 請求(GET、POST等)和若干個控制代碼組成,它的結構如下: app.METHOD(path, [callback…], callback), app 是 express 物件的一個例項, METHOD 是一個 HTTP 請求方法, path 是伺服器上的路徑, callback 是當路由匹配時要執行的函式。
路由方法
路由method有很多種,我們常見的有POST,GET兩種。基本的寫法如下。這裡的路由地址可以是字串,也可以是字串模式或者正則表示式,req是請求物件,res是響應物件,next()負責將控制權交給下一個中介軟體。中介軟體的概念後面會提到。
// GET method route
app.get('/', function (req, res, next) {
res.send('GET request to the homepage');
next();
});
// POST method route
app.post('/', function (req, res, next) {
res.send('POST request to the homepage');
next();
});
還有一種不區分請求方式的寫法,不管使用 GET、POST、PUT、DELETE 或其他任何 http 模組支援的 HTTP 請求,控制代碼都會得到執行。
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...');
next(); // pass control to the next handler
});
app.route()
通過這個方法建立路由路徑的鏈式路由控制代碼。由於路徑在一個地方指定,這樣做有助於建立模組化的路由,而且減少了程式碼冗餘和拼寫錯誤。書寫格式如下:
app.route('/book')
.get(function(req, res) {
res.send('Get a random book');
})
.post(function(req, res) {
res.send('Add a book');
})
.put(function(req, res) {
res.send('Update the book');
});
express.Router
可使用 express.Router 類建立模組化、可掛載的路由控制代碼。Router 例項是一個完整的中介軟體和路由系統。這樣我們就可以在一個檔案中專門做路由處理,而在app.js中use這個中介軟體。
例如我們在一個routes.js檔案中這樣使用。
// routes.js檔案
var express = require('express');
var router = express.Router();
// 定義網站主頁的路由
router.get('/', function(req, res) {
res.send('home page');
});
// 這裡把中介軟體匯出,供app.js使用
module.exports = router;
app.js中這樣使用:
var router = require('./router');
// 其他處理邏輯程式碼
...
...
...
// 最後use路由中介軟體
app.use('/', router);
靜態檔案
使用靜態檔案服務
express的靜態檔案可以放在public資料夾中。通過Express內建的express.static可以方便地託管靜態檔案,例如圖片、CSS、JavaScript 檔案等。
app.use(express.static('public'));
然後就可以訪問public中的靜態資源了。
http://localhost:3000/images/avatar.jpg
多個靜態資原始檔夾
如果靜態資源存放在多個目錄下面,我們可以多次呼叫 express.static 中介軟體。例如:
app.use(express.static('public'));
app.use(express.static('assets'));
掛在虛擬目錄下
app.use('/resourse', express.static('public'));
那麼訪問的方式就是
http://localhost:3000/resourse/images/avatar.jpg
中介軟體
定義
什麼叫中介軟體,引用官方的解釋就是:
中介軟體(Middleware) 是一個函式,它可以訪問請求物件(request object (req)), 響應物件(response object (res)), 和 web 應用中處於請求-響應迴圈流程中的中介軟體,一般被命名為 next 的變數。Express 是一個自身功能極簡,完全是由路由和中介軟體構成一個的 web 開發框架:從本質上來說,一個 Express 應用就是在呼叫各種中介軟體。
中介軟體可以做的事情
(1)執行任何程式碼。
(2)修改請求和響應物件。
(3)終結請求-響應迴圈。
(4)呼叫堆疊中的下一個中介軟體。
中介軟體分類
應用級中介軟體
應用級中介軟體繫結到app物件,使用 app.use() 和 app.METHOD()。其中METHOD 是需要處理的 HTTP 請求的方法,例如 GET, PUT, POST 等等,全部小寫。
// 沒有掛載路徑的中介軟體,應用的每個請求都會執行該中介軟體
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
// 掛載至 /user/:id 的中介軟體,任何指向 /user/:id 的請求都會執行它
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
// app.get
// app.post
// ...
路由級中介軟體
就是上文中說到的 express.Router(),是由app.use來呼叫。
錯誤處理中介軟體
錯誤處理中介軟體有 4 個引數,定義錯誤處理中介軟體時必須使用這 4 個引數。即使不需要 next 物件,也必須在簽名中宣告它,否則中介軟體會被識別為一個常規中介軟體,不能處理錯誤。
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
});
內建中介軟體
express.static 是 Express 唯一內建的中介軟體。它負責在 Express 應用中託管靜態資源。一般用法如下:
app.use(express.static(path.join(__dirname, 'public'), option));
express.static可以傳option引數,option具體內容如下:
第三方中介軟體
第三方提供的中介軟體,如 cookie-parser等。也是由app.use載入。
var cookieParser = require('cookie-parser');
// 載入用於解析 cookie 的中介軟體
app.use(cookieParser());