前端我们知道,一个域名后面跟的pathname可以作为特殊内容去请求后端资源,那么,后端是如何识别这个pathname,并执行到对应的流程呢?以node为例,我们介绍一下如何通过手动映射,去实现路由:
手工映射
首先我们需要新建一个route/index.js文件
// 保存路由和actions的映射
const routes = [];
const use = (path,action) => {
// 这个path支持使用正则,并且可以通过正则实现动态路由
routes.push([path,action])
}
module.exports = {
routes,
use
}
在这个文件中,我们用routes做为路由的数组收集,每项内容为一个path和一个action
然后我们再建立一个controller/index.js文件
// 实际执行的actions
const getData1 = (req,res) => {
res.end('get data1')
}
const getData2 = (req,res) => {
res.end('get data2')
}
const getData3 = (req,res) => {
res.end('get data3')
}
module.exports = {
getData1,
getData2,
getData3
}
这个文件包含了一个个世纪执行的action
最后,与前面两个文件夹同级目录建立一个index.js
const http = require('http');
const fs = require('fs');
const querystring = require('querystring');
const url = require('url');
// 导入路由
const { use, routes } = require('./route/index');
// 导入action
const { getData1,getData2,getData3 } = require('./controller/index');
// 绑定路由和action
use('/user/data1',getData1);
use('/user/data2',getData2);
use('/user/:data3',getData3);
const port = 8138;
const hostname = '127.0.0.1';
// for循环遍历url的pathname,并执行对应的action,如果没有找到就返回404
const basicHandle = (req,res) => {
const pathname = url.parse(req.url).pathname;
console.log(url.parse(req.url))
for ( let i = 0 ; i < routes.length ; i++ ) {
const route = routes[i];
if ( pathname === route[0] ) {
const action = route[1];
action(req,res);
return;
}
}
res.end('404');
}
const server = http.createServer((req,res) => {
basicHandle(req,res)
})
server.listen(port,hostname,() => {
console.log(`its running: http://${hostname}:${port}`,)
})
可以发现,我们通过use方法不断的去压入路径和action,而这种做法便是路由的形成,我们甚至可以在controller中合理的新建文件,最后便可以形成一层层、分类写各种action。
basicHandle方法在执行的时候,会遍历一个routes,如果找到,便会执行对应的action,没有则返回404。
以上便是node的手工路由映射实现过程,实不相瞒,我想要一个赞 ==__==