美文网首页
node - http模块 学习记录(二)路由实现

node - http模块 学习记录(二)路由实现

作者: 流年谱写我们消逝的回忆 | 来源:发表于2019-11-15 16:27 被阅读0次

本文仅本人自学总结,若有不当之处,欢迎指正


前文用http模块实现了对请求的监听和处理,但并未实现对不同地址的请求做出不同的响应,在本文中我将实现服务器路由功能。


首先,让我们创建一个文件夹,作为我们的工程目录。目录结构如下

project--------
            |----/web  //作为网站更目录哦,后可重新配置
            |----/router //路由器实现文件夹
                  |---control.js 
                  |---router.js
                  |---myWriteHead.js
            |----main.js //服务器入口
            |----webconfige.json  //服务器简单配置文件

创建上述文件后,基本结构框架已经搭载好!
首先打开main.js文件 创建一个服务器,并在8080端口监听服务器请求

const http = require('http'); //导入http模块
const serve = http.createServer((req, res) => {
  require('./router/router')(req, res);//将请求交给router模块进行处理
}).listen(8080,'127.0.0.1',()=>{console.log("serve runing");});

打开router文件夹下的router.js文件对路由进行实现
在router.js文件中,并未对请求进行回应,而是让服务器对请求进行筛选!在此,我们仅接受'GET'和'POST'请求。

//因为在main.js有对router的使用,所以我们对其进行导出
module.exports = function(req, res) {
  if (req.method==='GET'||req.method==='POST'){
    require('./control')(req, res); //对于符合请求方式的请求,我们交给control模块进行实际处理
  }else{
    //不符合条件请求,返回状态码403
    res.writeHead(403, {'Content-Type':'text/plain'});    
    res.end();
  }
};

我们对请求方式控制后,接下来我们要来实际处理请求了。
这步我们在control.js中实现

//在router.js中使用,我们同样进行导出
module.exports=function(req, res) {
  const fs = require('fs'); //引入node的文件系统
  const URL = require('url'); //引入url模块,对请求中的url进行解析使用
  //实例化url模块下的url类,并传入请求中的url
  const req_url = new URL.URL(req.url, 'http:///'+req.headers.host); 
 //处理路径文件中的空格,在url编码中空格会被转化成'%20'
  let aimFilePath = req_url.pathname.replace(/%20/g,' ');


  //---------此过程主要用于判断请求的文件类型-----------  
  const aim_file = req_url.pathname.split('/')[req_url.pathname.split('/').length-1];
  const aim = aim_file.split('.');
  let type = aim[aim.length-1];  
  //--------------------------------------------------

 
  //处理仅访问目录情况,
  //如果访问目录,将访问目录下配置的默认文件
  //由webconfige.json配置
  if(aim.length<2){
    aimFilePath += require('../webConfig').defualtName;
    type = 'html';
  }

  //打开请求文件
  fs.readFile(require('../webConfig').rootweb+aimFilePath,((err, data) => {
    //如果打开失败,则返回未找到
    if(err){
      res.writeHead(200,{'Content-Type': 'text/html'});
      console.log(err.message);
      res.end('<h1>404</h1><h1>not  find</h1>');
      return 0;
    }
    //如果有文件,就返回在文件中读取的数据
    //设置返回类型,content-type属性,决定浏览器如何解析数据  
    require('./myWriteHead.js')(res, type); //引入了myWriteHead.js来处理
    res.end(data);//返回数据
  }))
};

接着我们来书写myWriteHead.js,以便让浏览器正确解析
我们会给myWriteHead.js中函数传入res对象与type(记录文件名后缀)

module.exports = function(res,type) {
  //根据不同的文件后缀设置不同的Content-type属性值
  switch (type) {
    case 'html':res.setHeader('Content-Type','text/html'); break;
    case 'png' :res.setHeader('Content-Type','text/png'); break;
    case 'jpg'|'jpeg' :res.setHeader('Content-Type','text/jpeg'); break;
    case 'gif' :res.setHeader('Content-Type','text/gif'); break;
    case 'xml' :res.setHeader('Content-Type','text/xml'); break;
    case 'js' :res.setHeader('Content-Type','application/javascript'); break;
    case 'css' :res.setHeader('Content-Type','text/css'); break;
  }
};

最后打开webconfig.json文件,让我们配置一下我们的服务器

{
  "rootweb": "D:\\untitled\\web", 
  "defualtName": "/index.html"
}

rootweb属性值决定了我们网站的根目录
defualtName属性值决定了我们网站的目录下的默认文件

到此,我们的简易版服务器就搭建好了,现在就可以向我们配置文件中配置的网站根目录中放置文件了,
打开终端,跳转到项目目录,执行node main.js就可以启动我们的服务器了
通过访问127.0.0.1:8080就可以访问我们的网站了。


我在目录下放置了两个文件index.js , css.css 用来测试html css代码是否生效,如图


相关文章

网友评论

      本文标题:node - http模块 学习记录(二)路由实现

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