Express的使用及原理

前言

ExpressKoa是目前最主流的基於node的web開發框架,他們的開發者是同一班人馬。貌似如今Koa更加流行,緣由在於咱們能夠基於Koa進行二次開發,這篇文章主要探討一下Expressjavascript

Express的經常使用功能

  • 路由控制
  • 中間件
  • 靜態文件服務
  • 模板解析

使用方法

在這裏介紹一些經常使用的api:html

先引用express,而且執行java

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

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

根據請求路徑來處理客戶端發出的GET等各類請求。第一個參數path爲請求的路徑, 第二個參數爲處理請求的回調函數。node

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

複製代碼

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

中間件就是處理HTTP請求的函數,用來完成各類特定的任務,好比檢查用戶是否登陸、檢測用戶是否有權限訪問等。若是path沒有寫,那麼默認就是"/",同時須要注意的是:中間件的執行是有順序的 web

app.use中放入的函數稱爲中間件函數,通常有三個特色:express

  • 一箇中間件處理完請求和響應能夠把相應數據再傳遞給下一個中間件。
  • 回調函數的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);
});
複製代碼

若是中間出錯,它會直接找到錯誤處理中間件來進行處理。api

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)

用來設置參數,例如渲染模板bash

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

6.app.engin()

規定文件用何種方式來進行渲染app

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

Express的原理

重點說說路由功能

路由和中間件,須要有地方來保存這些信息,好比路由信息,好比中間件回調函數等等,express中有一個對象Router對象專門用來存儲中間件對象,他有一個數組叫stack,保存了全部的中間件對象,而中間件對象是Layer對象。

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工做原理和源碼分析一:建立路由

相關文章
相關標籤/搜索