本文仅本人自学总结,若有不当之处,欢迎指正
前文用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代码是否生效,如图
网友评论