抖机灵之实现一个express的路由模块

510 阅读2分钟

我们先来看看express的路由模块是怎么注册和触发的吧

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

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

    console.log('/index');
})

引入express的路由模块,通过get方法传入路径和对应的函数。

实现思路

我们可以看到上面的例子中,router包含两个参数,路径函数。同理,我们要实现的路由函数也应该包含这两部分。 这里我们要用到node的两个模块来实现这个功能,

url: 解析路由

events: 注册以及触发路由事件

路由注册功能

我们先来实现路由的注册功能。 新建一个route.js

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来分发路由。

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中注册一个路由

。。。
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,回车

顺利!。

总结

没啥好总结的,只是今天看到nodeEventEmitter类时突然产生的灵感,做个机灵。能顺手骗个赞就更好了。