Express路由是如何实现的?

2020-11-26 14:51:23 浏览数 (1)

Express是一个极简的Node.js后端开发框架,它最强大的地方在于它的路由实现,那么它的路由是如何实现的呢?下面给大家分享两段代码,希望大家能够有个简单的认识。

首先是封装的路由模块

代码语言:javascript复制
var url = require('url');

// 封装res.send()方法
function changeRes(res) {
    res.send = function (data) {
        res.writeHead(200, { "Content-Type": "text/html;charset='utf-8'" });
        res.end(data);
    }
};

// 定义主服务方法
var Server = function () {
    var G = this;
    // 处理GET和POST请求
    this._get = {};
    this._post = {};

    var app = function (req, res) {
        changeRes(res);
        // 获取路由
        var pathname = url.parse(req.url).pathname;
        // 处理URL路由,将结尾加上'/',与注册方法统一
        if (!pathname.endsWith('/')) {
            pathname = pathname   '/';
        };
        // 获取请求的方式,GET和POST请求
        var method = req.method.toLowerCase();
        // 判断方法是否存在
        if (G['_'   method][pathname]) {
            // 执行POST请求
            if (method == 'post') {
                var postStr = '';
                req.on('data', function (chunk) {
                    postStr  = chunk;
                });
                req.on('end', function (err, chunk) {
                    req.body = postStr;
                    G['_'   method][pathname](req, res);
                });
                // 执行GET请求
            } else {
                G['_'   method][pathname](req, res);
            };
        } else {
            res.end('no router');
        };
    };
    // 定义一个GET方法为所有的GET请求注册
    app.get = function (string, callback) {
        // 将请所有注册路由前后加上'/'
        if (!string.endsWith('/')) {
            string = string   '/';
        };
        if (!string.startsWith('/')) {
            string = '/'   string;
        };
        G._get[string] = callback;
    };
    // 定义一个POST方法为所有的POST请求注册
    app.post = function (string, callback) {
        // 将请所有注册路由前后加上'/'
        if (!string.endsWith('/')) {
            string = string   '/';
        };
        if (!string.startsWith('/')) {
            string = '/'   string;
        };
        G._post[string] = callback;
    };
    return app;
}

module.exports = Server();

下面是引入路由并使用。

代码语言:javascript复制
var http=require('http');
var ejs=require('ejs');
// 引入封装的路由
var app=require('express-route.js');
http.createServer(app).listen(3000);

// 注册首页的路由(方法)
app.get('/',function(req,res){
    var msg='这是数据库的数据'
    ejs.renderFile('views/index.ejs',{msg:msg},function(err,data){
        res.send(data);
    })
});

// 注册login的路由(方法)
app.get('/login',function(req,res){
    console.log('login');
    ejs.renderFile('views/form.ejs',{},function(err,data){
        res.send(data);
    })
});


// 注册dologin的路由(方法)
app.post('/dologin',function(req,res){
    console.log(req.body);  
    res.send("<script>alert('登录成功');history.back();</script>");
})

0 人点赞