抖機靈之實現一個express的路由模塊

咱們先來看看express的路由模塊是怎麼註冊和觸發的吧

const express = require("express");
const router = express.Router();

router.get('/index', (req, res) => {

    console.log('/index');
})
複製代碼

引入express的路由模塊,經過get方法傳入路徑和對應的函數。html

實現思路

咱們能夠看到上面的例子中,router包含兩個參數,路徑函數。同理,咱們要實現的路由函數也應該包含這兩部分。 這裏咱們要用到node的兩個模塊來實現這個功能,node

url: 解析路由express

events: 註冊以及觸發路由事件瀏覽器

路由註冊功能

咱們先來實現路由的註冊功能。 新建一個route.jsbash

var evt = require('events');  // 引入events模塊
var route = new evt.EventEmitter(); // 初始化一個事件對象

function registeEvt(key, fn) {
    route.on(key, fn) 
}

route.registeEvt = registeEvt; //  給事件添加註冊功能


exports.route = route;  // 暴露事件
複製代碼

如何觸發路由,分發請求

接下來咱們實現一下路由的分發。 新建一個入口文件index.js函數

var http = require('http');

http.createServer(function(request, response) {
    ....
}).listen(8888);

console.log('server is listen at http://127.0.0.1:8888');
複製代碼

咱們在這裏建立了一個http服務,監聽端口8888, 在express中,當請求過來的時候,是由路由對其作處理。請求過來時將觸發對應的路由,調用對應的函數。 所以咱們能夠在服務中經過介些url獲取到pathname來分發路由。ui

var http = require('http');
var url = require('url'); 
var route = require('./route.js').route;

http.createServer(function(req, res) {
    let path = url.parse(req.url).pathname;
    route.emit(path, req, res);  // 觸發對應的事件, 由於咱們是在路由中處理請求,所以須要將req和res傳遞過去
}).listen(8888);

console.log('server is listen at http://127.0.0.1:8888');
複製代碼

嘗試一下注冊路由

如今咱們來嘗試在index.js中註冊一個路由url

。。。
var route = require('./route.js').route;

route.registeEvt('/index.html', function(req, res) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });

    res.end('hello world11234');
})

。。。
複製代碼

而後咱們啓動服務 node index.js,在瀏覽器地址欄輸入localhost:8888/index.html,回車spa

順利!。code

總結

沒啥好總結的,只是今天看到nodeEventEmitter類時忽然產生的靈感,作個機靈。能順手騙個贊就更好了。

相關文章
相關標籤/搜索