1. 程式人生 > >express搭建簡單的後臺伺服器(基礎篇)

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());