我们先来看看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
,回车
顺利!。
总结
没啥好总结的,只是今天看到node
的EventEmitter
类时突然产生的灵感,做个机灵。能顺手骗个赞就更好了。