Express的使用及原理

romin發表於2018-03-17

前言

ExpressKoa是目前最主流的基於node的web開發框架,他們的開發者是同一班人馬。貌似現在Koa更加流行,原因在於我們可以基於Koa進行二次開發,這篇文章主要探討一下Express

Express的常用功能

  • 路由控制
  • 中介軟體
  • 靜態檔案服務
  • 模板解析

使用方法

在這裡介紹一些常用的api:

先引用express,並且執行

let express = require('express');
let app = express();
app.listen(8080, () => {
    console.log(8080)
});
複製程式碼

1. app[method](path, function(req, res){})

根據請求路徑來處理客戶端發出的GET等各種請求。第一個引數path為請求的路徑, 第二個引數為處理請求的回撥函式。

app.get('/', function (req, res) {
    res.end('ok');
});

複製程式碼

2 app.use([path,] function [, function...])

中介軟體就是處理HTTP請求的函式,用來完成各種特定的任務,比如檢查使用者是否登入、檢測使用者是否有許可權訪問等。如果path沒有寫,那麼預設就是"/",同時需要注意的是:中介軟體的執行是有順序的

app.use中放入的函式稱為中介軟體函式,一般有三個特點:

  • 一箇中介軟體處理完請求和響應可以把相應資料再傳遞給下一個中介軟體。
  • 回撥函式的next引數,表示接受其他中介軟體的呼叫,函式體中的next(),表示將請求資料繼續傳遞。
  • 可以根據路徑來區分返回執行不同的中介軟體。
//使用use來定義一箇中介軟體 next也是一個函式,呼叫它則意味著當前的中介軟體執行完畢,可以繼續向下執行別的中介軟體了
app.use(function (req, res, next) {
    res.setHeader('Content-Type', 'text/html;charset=utf8');
    console.log('沒有路徑的中介軟體');
    //呼叫next的時候如果傳一個任意引數就表示此函式發生了錯誤,
    //然後express就會跳過後面所有的中介軟體和路由
    //交給錯誤處理中介軟體來處理
    next('我錯了');
});
app.use('/user1', function (req, res, next) {
    console.log('user1')
    next()
});
app.use('/user2', function (req, res, next) {
    console.log('user2')
    res.end('user2');
});
//錯誤處理中介軟體有四個引數
app.use('/hello', function (err, req, res, next) {
    res.end('hello ' + err);
});
複製程式碼

如果中間出錯,它會直接找到錯誤處理中介軟體來進行處理。

4.app.param(paramName, callback)

用來批量處理路徑中的引數

app.get('/username/:userid/:name', function (req, res) {
    res.end(req.params.name+req.params.name);
});
app.param('userid',function(req,res,next,userid,name){
    next();
})
複製程式碼

5. app.set(key, val)

用來設定引數,例如渲染模板

app.set('views', path.resolve(path.join(__dirname, 'views')));
app.set('view engine', 'html');
複製程式碼

6.app.engin()

規定檔案用何種方式來進行渲染

app.engine('html',html);
複製程式碼

Express的原理

重點說說路由功能

路由和中介軟體,需要有地方來儲存這些資訊,比如路由資訊,比如中介軟體回撥函式等等,express中有一個物件Router物件專門用來儲存中介軟體物件,他有一個陣列叫stack,儲存了所有的中介軟體物件,而中介軟體物件是Layer物件。

Express的使用及原理

Express的使用及原理

app.use([path,] function [, function...]),

app.use([path,] function [, function...]),

app.use... 代表上圖左側的layer,而括號中的函式則代表了layer1,layer2,所以它們的執行順序應該是一層一層執行的。

關於RouerRoute的解析:

  • Route 物件的主要作用就是建立一個路由中介軟體,並且建立多個方法的layer儲存到自己的stack陣列中
  • Router物件的主要作用就是建立一個普通中介軟體或者路由中介軟體的引導者(引導Layer物件連結到回一個route物件),然後將其儲存在自己的stack陣列中去。

參考資料

根據原始碼模擬實現express框架常用功能

Express工作原理和原始碼分析一:建立路由

相關文章