Nodejs 路由模块封装、封装仿照 express 的路由(9)

1、 模块化的方式封装

`model/model.js`

// 导入模块
var ejs=require(‘ejs‘);

var fs=require(‘fs‘);

var app ={
    // login
    login:function (req, res) {
        console.log(‘login‘);
        ejs.renderFile(‘views/form.ejs‘,{},function (err,data) {
            res.end(data);
        })
    },
    // dologin
    dologin:function (req, res) {
        console.log(‘333dologin‘);

        var postStr = ‘‘;
        req.on(‘data‘,function (chunk) {
            postStr+= chunk;
        });
        req.on(‘end‘,function (err,chunk) {
            console.log(postStr);
            fs.appendFile(‘login.txt‘,postStr+‘\n‘,function (err) {
                if (err){
                    console.log(err);
                    return false;
                }
                console.log(‘写入成功‘)
            });
            res.end("<script>alert(‘登录成功‘);history.back();</script>")
        });
    },
    // register
    register:function (req, res) {
        console.log(‘register‘);
        res.end(‘register‘)
    },
    home:function (req, res) {
        console.log(‘home‘);
        res.end(‘home‘)
    }
};

// 暴露
module.exports=app;

/*
调用方式
app.login(req,res)
app[‘login‘](req,res)
 */

` 01 services.js`

//引入http模块
var http=require(‘http‘);
var url =require(‘url‘);

// 导入自己封装的路由
var model = require(‘./model/model‘);

//路由:指的就是针对不同请求的 URL,处理不同的业务逻辑。
http.createServer(function(req,res){
    // http://localhost:8001/login
    res.writeHead(200,{"Content-Type":"text/html;charset=‘utf-8‘"});
    var pathname = url.parse(req.url).pathname.replace(‘/‘,‘‘)
    console.log(pathname);

    // 调用路由,处理逻辑
    if (pathname!==‘favicon.ico‘){
        try{
            model[pathname](req,res);
        }catch (err) {
            model[‘home‘](req,res)
        }
    }

}).listen(8001);

2、 封装仿照 express 的路由

1、nodejs 万事万物皆为对象

  构建一个app对象,可以再绑定属性和方法

var app=function(){

    console.log(‘app‘);
}

app.get=function(){
    console.log(‘app.get‘);
}
app.post=function(){
    console.log(‘app.post‘);
}

app.post() /*app.post*/

//
app()   /*app*/

2 仿照 express,封装路由

```

代码执行顺序: 从上到下

```

var G ={};

var app =function (req, res) {
    if (G[‘login‘]){
        G[‘login‘](req,res);/*执行注册方法*/
    }
};

// 定义一个get 方法
app.get = function (string, callback) {
    G[string]=callback // G[string] = 函数
};

// 执行get方法 login 页面的处理逻辑
app.get(‘login‘,function (req, res) {
    console.log(‘login‘+req)
});
// 程序开始执行
setTimeout(function () {
    app(‘req‘,‘res‘)
},1000);

再次升级 `03 router_express_2.js`

var http=require(‘http‘);
var url= require(‘url‘);
var G ={};

var app =function (req, res) {
    var pathname = url.parse(req.url).pathname.replace(‘/‘,‘‘);
    console.log(pathname);
    if (G[pathname]){
        G[pathname](req,res);
    }

    // if (G[‘login‘]){
    //     G[‘login‘](req,res);/*执行注册方法*/
    // }
};

// 定义一个get 方法
app.get = function (string, callback) {
    G[string]=callback // G[string] = 函数
};

// 只需要请求,就会触发app这个方法
http.createServer(app).listen(8001);

// 注册login 路由
app.get(‘login‘,function (req, res) {
    console.log(‘login‘);
    res.end(‘login‘);
});

// 注册 register 路由
app.get(‘register‘,function (req, res) {
    console.log(‘register‘);
    res.end(‘register‘);
});

最后的封装

`model/express_router.js`

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) {
        // res 封装send方法
        changeRes(res);

        var pathname = url.parse(req.url).pathname.replace(‘/‘,‘‘);
        var method = req.method.toLowerCase();
        console.log(method,pathname);
        console.log(G[‘_‘+method]);

        if (G[‘_‘+method][pathname]){
            if (method ===‘post‘){ /* 处理 post 请求 */
                var postStr =‘‘;
                req.on(‘data‘,function (chunk) {
                    postStr+=chunk
                });
                req.on(‘end‘,function (err, chunk) {
                    req.body = postStr;
                    G[‘_‘+method][pathname](req,res); /*执行方法*/
                    // res.end(pathname)
                })
            }else{ /* 处理非 post 请求 */
                G[‘_‘+method][pathname](req,res)
                // res.end(pathname)

            }
        }else{
            res.end(‘no router!‘)
        }
    };

    // 注册方式
    app.get=function (string, callback) {
        console.log( G._get[string],string);

        G._get[string]=callback
    };

    app.post=function (string, callback) {
        G._post[string]=callback
    };
    return app
};

module.exports = Server();

执行程序 `router_express_module.js`

var http = require(‘http‘);
var ejs = require(‘ejs‘);
var app = require(‘./model/express_router.js‘);
console.log(app);

http.createServer(app).listen(8001);

//登录页面
app.get(‘login‘,function(req,res){

    ejs.renderFile(‘views/form.ejs‘,{},function(err,data){

        res.send(data);
    })

});
app.post(‘dologin‘,function (req, res) {
    res.send("<script>alert(‘successful !‘);history.back();</script>")
});

app.get(‘news‘,function (req, res) {
    res.send("国际大新闻")
});

原文地址:https://www.cnblogs.com/angle6-liu/p/11742476.html

时间: 2024-11-09 20:08:34

Nodejs 路由模块封装、封装仿照 express 的路由(9)的相关文章

类似express的路由封装方式

1.原理 主要过程涉及三个元素的定义,如下: //用于承载一系列方法的对象 var funObj = {}; //用于根据条件执行funObj中的方法 var app = function(){}; //用于向funObj添加方法 app.get = function(){}; 2.具体实现 a. 路由框架的封装(route.js) //========================== // 类似express的路由框架 //========================== var ur

初识NodeJS服务端开发(Express+MySQL)

NodeJS对前端来说无疑具有里程碑意义,在其越来越流行的今天,掌握NodeJS已经不再是加分项,而是前端攻城师们必须要掌握的技能.本文将与同志们一起完成一个基于Express+MySQL的入门级服务端应用,即可以对数据库中的一张表进行简单的CRUD操作.但本人还是斗胆认为,通过这个应用,可以让没怎么接触后端开发的同志对使用Node进行后端开发有一个大致了解. Express工程环境准备 安装express,和express项目种子生成器(什么?你问第1步为什么不是安装NodeJS,我也只能呵呵

NodeJS学习之2:express版的Hello World

接着 NodeJS学习之1:express安装 的结果: 我们继续应用程序的编写. 新建一个 app.js 文件 $ touch app.js copy 进去这些代码 // 这句的意思就是引入 `express` 模块,并将它赋予 `express` 这个变量等待使用. var express = require('express'); // 调用 express 实例,它是一个函数,不带参数调用时,会返回一个 express 实例,将这个变量赋予 app 变量. var app = expre

nodejs小问题:[1]express不是内部或外部命令

nodejs小问题:[1]express不是内部或外部命令 浏览:9424 | 更新:2015-08-28 05:31 1 2 3 4 5 6 7 分步阅读 一时兴起想学习点东西,准备在heroku上部署一个Node.js的小程序.公司电脑之前没有装Node.js,于是下载最新版本的Node.js,当我安装express之后发现居然提示express不是内部或外部命令.然后经过我不懈努力,终于发现端倪,下面分享给大家(我是在Windows上用的Node.js). 工具/原料  Node.js安装

nodejs解决找不到express命令的问题

一般的书或者教程上的安装步骤是:(需要是-g,即全局安装) npm install -g express //全局安装 而我们应该多多关注下express的文档,github地址:https://github.com/visionmedia/express#quick-start 提示express的安装命令也更新了,需要安装express-generator npm install -g express //全局安装 npm install -g express-generator //这段命

nodejs版本号更新问题:express不是内部或外部命令

版本号更新后,我们使用熟悉的npm install -g express命令安装,可是,成功安装之后竟然提示express不是内部或外部命令. nodejs小问题:[1]express不是内部或外部命令 nodejs小问题:[1]express不是内部或外部命令 为什么会这样子呢? 当我们找到安装后的express文件夹发现比之前熟悉的express少了非常多东西. nodejs小问题:[1]express不是内部或外部命令 nodejs小问题:[1]express不是内部或外部命令 怎么办呢?

Nodejs封装一个类似express框架的路由

var http=require('http'); var ejs=require('ejs'); var app=require('./model/express-route.js'); console.log(app); http.createServer(app).listen(3000); app.get('/',function(req,res){ var msg='这是数据库的数据' ejs.renderFile('views/index.ejs',{msg:msg},functio

swift 动手写网络请求封装(仿照了一个大神的)不用导入第三方

新建一个类Network import UIKit //NSURLSession 的使用过程: // //构造 NSURLRequest //确定 URL //确定 HTTP 方法(GET.POST 等) //添加特定的 HTTP 头 //填充 HTTP Body //驱动 session.dataTaskWithRequest 方法,开始请求 //(5)设置 SSL 证书钢钉.在我们调用 HTTPS 协议的时候,事先把 SSL 证书存到 App 本地,然后在每次请求的时候都进行一次验证,避免中

nodejs mysql 事务封装

mysql.js const mysql = require("mysql2"); class MysqlModel { constructor() { this.mysqlConfig = config.mysql; } /** * 实例化mysql */ mysqlInstance() { const poolCluster = mysql.createPoolCluster({ removeNodeErrorCount: 1, // Remove the node immedia