Nodejs封装类似express框架的路由实例详解


Posted in NodeJs onJanuary 05, 2020

代码如下

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},function(err,data){

    res.send(data);
  })
})


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

  console.log('login');

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

    res.send(data);
  })

})

//执行登录
app.post('/dologin',function(req,res){

  console.log(req.body); /*获取post传过来的数据*/

  res.send("<script>alert('登录成功');history.back();</script>")
})


app.get('/register',function(req,res){

  console.log('register');

  res.send('register');
})

app.get('/news',function(req,res){

  console.log('register');

  res.send('新闻数据');
})

express-route.js

var url=require('url');

//封装方法改变res 绑定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;
    if(!pathname.endsWith('/')){
      pathname=pathname+'/';
    }

    //获取请求的方式 get post
    var method=req.method.toLowerCase();


    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; /*表示拿到post的值*/


          //G._post['dologin'](req,res)

          G['_'+method][pathname](req,res); /*执行方法*/

        })



      }else{ /*执行get请求*/
        G['_'+method][pathname](req,res); /*执行方法*/

      }

    }else{

      res.end('no router');
    }

  }

  app.get=function(string,callback){
    if(!string.endsWith('/')){
      string=string+'/';
    }
    if(!string.startsWith('/')){
      string='/'+string;

    }

    //  /login/
    G._get[string]=callback;

  }

  app.post=function(string,callback){
    if(!string.endsWith('/')){
      string=string+'/';
    }
    if(!string.startsWith('/')){
      string='/'+string;

    }
    //  /login/
    G._post[string]=callback;

    //G._post['dologin']=function(req,res){
    //
    //}
  }

  return app;

}

module.exports=Server();

以上代码很简单,大家可以测试下,如果有任何疑问和补充可以联系小编,更多内容可以查看以下相关知识点。

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 #NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 #NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 #NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 #NodeJs
NodeJS实现一个聊天室功能
Nov 25 #NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 #NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 #NodeJs
You might like
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
ejs v9 javascript模板系统
2012/03/21 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
django解决订单并发问题【推荐】
2019/07/31 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
应聘教师推荐信
2013/10/31 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
人民调解员培训方案
2014/06/05 职场文书
三年级学生期末评语
2014/12/26 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
欠条样本
2015/07/03 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS