美文网首页
Node.js - 封装类似Express的路由

Node.js - 封装类似Express的路由

作者: 饮杯梦回酒 | 来源:发表于2019-03-16 21:13 被阅读0次

    导读:

    • 先通过封装 Express 路由模块然后导出到主入口文件,主入口文件直接注册即可调用。
    • 目录结构如下:


      涉及文件

    结果展示:

    首页.png
    登录页.png
    注册页.png
    新闻页.png

    封装代码:

    • express_route.js (路由文件)
    const url = require('url')
    
    //封装方法改变res  绑定res.send()
    let changeRes = (res) => {
    
        res.send = (data) => {
    
            res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})
    
            res.end(data)
        }
    }
    
    // 暴露的module
    let Server = () => {
    
        let G = this   // 全局变量
    
        // 处理 get和post 请求
        this._get = {}
        this._post = {}
    
        let app = (req, res) => {
    
            changeRes(res)
    
            // 获取路由
            let pathName =  url.parse(req.url).pathname 
    
            if(!pathName.endsWith('/')) pathName += '/'
    
            // 获取请求的的方式
            let method = req.method.toLowerCase()
    
            // 如果注册了相应请求的相应方法
            if(G['_' + method][pathName]) {
    
                // 如果是 post 请求
                if(method === 'post') {
    
                    let postStr = ''
    
                    req.on('data', (chunk) => { 
    
                        postStr += chunk
    
                    })
    
                    req.on('end', (err, chunk) => {
    
                        req.body = postStr   // 表示拿到post的值
    
                        G['_' + method][pathName](req, res)  // 执行方法
    
                    })
    
                } else {
    
                    G['_' + method][pathName](req, res)  // 执行方法
    
                }
    
            } else {
    
                res.end('no router')
            }
    
        }
    
        // 绑定 app.get和app.post 方法
        app.get = (string, callback) => {
    
            if(!string.endsWith('/')) {
                string = string + '/'
            }
            if(!string.startsWith('/')) {
                string = '/' + string
            }
    
            G._get[string] = callback
    
        }
    
        app.post = (string, callback) => {
    
            if(!string.endsWith('/')) {
                string = string + '/'
            }
            if(!string.startsWith('/')) {
                string = '/' + string
            }
    
            G._post[string] = callback
    
        }
    
        return app
    
    }
    
    module.exports = Server()
    
    
    • express_module.js (入口文件,注册路由即可调用)
    const http = require('http')
    const ejs = require('ejs')
    const app = require('./express_route.js')
    
    
    // 只要有请求,就会触发app里的方法
    http.createServer(app).listen(3000)
    
    
    // 注册根路由
    app.get('/', (req, res) => {
    
        var msg='这是首页'
    
        ejs.renderFile('./index.ejs', { msg: msg }, (err, data) => {
    
            res.send(data)
        })
    })
    
    // 登录页面
    app.get('/login', (req, res) => {
    
        console.log('login')
    
        ejs.renderFile('./form.ejs', {}, (err, data) => {
    
            res.send(data)
        })
    })
    
    // 执行登录
    app.post('/dologin', (req, res) => {
    
        console.log(req.body)  /*获取post传过来的数据*/
    
        res.send("<script>alert('登录成功');history.back();</script>")
    })
    
    // 注册页面
    app.get('/register', (req, res) => {
    
        console.log('register')
    
        res.send('register')
    })
    
    // 新闻页面
    app.get('/news', (req, res) => {
    
        console.log('register')
    
        res.send('新闻数据')
    })
    
    
    • 其余文件
      可能大家也比较好奇其他文件,ejs 主要是后台模板渲染引擎,渲染HTML页面用的。

    总结:

    • 其实学框架最根本就在掌握其设计原理,如果小伙伴在学习Node.js,不妨尝试动手封装一个类似 Express 路由的功能,这对你今后开发对于路由的理解一定会很有帮助的,剩下自行体会!

    相关文章

      网友评论

          本文标题:Node.js - 封装类似Express的路由

          本文链接:https://www.haomeiwen.com/subject/kqhdmqtx.html