2、路由
官方解释:
路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成 的,涉及到应用如何响应客户端对某个网站节点的访问。
路由指的就是针对不同请求的 ,处理不同的业务逻辑。
EJS 模块引擎
EJS ,可以把我们数据库和文件读取的数据显示到 Html 页面上面。它 是一个第三方模块,需要通过 npm 安装
https://www.npm js.com /package/ejs
npm install ejs –save / cnpm install ejs --save
Nodejs 中使用:
ejs.renderFile(filename, data, options, function(err, str){ // str => Rendered HTML string
});
<%%>流程控制标签
<%=%>输出标签(原文输出HTML标签)
<%-%>输出标签(HTML会被浏览器解析)
Get、Post
超文本传输协议(HTTP)的设计目的是保证客户端机器与服务器之间的通信。 在客户端和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET - 从指定的资源请求数据。(一般用于获取数据)
POST - 向指定的资源提交要被处理的数据。(一般用于提交数据)
获取 GET 传值:
var urlinfo=url.parse(req.url,true);
urlinfo.query();
获取 POST 传值:
var postData = ''; // 数据块接收中
req.on('data', function (postDataChunk) { postData += postDataChunk;
});
// 数据接收完毕,执行回调函数
req.on('end', function () { try {
postData = JSON.parse(postData); } catch (e) { }
req.query = postData;
console .log(q uerystring .parse(postData));
});
案例:
router.js
//fs模块
var fs=require('fs');
//path模块
var path=require('path'); /*nodejs自带的模块*/
//url模块
var url=require('url');
//获取文件类型的方法 私有
function getMime(extname,callback){ /*获取后缀名的方法*/
fs.readFile('./mime.json',function(err,data){
if(err){
console.log('mime.json文件不存在');
return false;
}
//console.log(data.toString());
var Mimes=JSON.parse(data.toString());
var result= Mimes[extname] || 'text/html';
callback(result)
})
}
exports.statics=function(req,res,staticpath){
var pathname=url.parse(req.url).pathname; /*获取url的值*/
if(pathname=='/'){
pathname='/index.html'; /*默认加载的首页*/
}
//获取文件的后缀名
var extname=path.extname(pathname);
if(pathname!='/favicon.ico'){ /*过滤请求favicon.ico*/
//console.log(pathname);
//文件操作获取 static下面的index.html
fs.readFile(staticpath+'/'+pathname,function(err,data){
if(err){ /*么有这个文件*/
console.log('404');
fs.readFile(staticpath+'/404.html',function(error,data404){
if(error){
console.log(error);
}
res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
res.write(data404);
res.end(); /*结束响应*/
})
}else{ /*返回这个文件*/
getMime(extname,function(mime){
res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"});
res.write(data);
res.end(); /*结束响应*/
});
}
})
}
}
demo01.js
//引入http模块
var http=require('http');
//引入扩展名的方法是在文件里面获取到的。
var router=require('./model/router.js');
//console.log(mimeModel.getMime('.css')); //获取文件类型
http.createServer(function(req,res){
router.statics(req,res,'static');
console.log(req.url);
}).listen(8001);
els案例:
//引入http模块
var http=require('http');
var url=require('url');
var ejs=require('ejs');
//路由:指的就是针对不同请求的 URL,处理不同的业务逻辑。
http.createServer(function(req,res){
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
var pathname=url.parse(req.url).pathname;
if(pathname=='/login'){
var data='你好我是后台数据';
var list=[
'1111',
'2222',
'3333',
];
//把数据库的数据渲染到模板上面
ejs.renderFile('views/login.ejs',{
msg:data,
list:list
},function(err,data){
res.end(data);
})
}else{
var msg='这是注册页面,也是注册的路由';
var h="<h2>这是一个h2</h2>"
ejs.renderFile('views/register.ejs',{
msg:msg,
h:h
},function(err,data){
res.end(data);
})
}
}).listen(8001);
login.ejs
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body>
<h2>这是一个ejs的后台模板引擎-登录</h2>
<h2><%=msg%></h2>
<br/>
<hr/>
<ul>
<% for(var i=0;i<list.length;i++){%>
<li><%=list[i]%></li>
<% } %>
</ul>
</body>
</html>
get,post
//引入http模块
var http=require('http');
var url=require('url');
var ejs=require('ejs');
var fs=require('fs');
//路由:指的就是针对不同请求的 URL,处理不同的业务逻辑。
http.createServer(function(req,res){
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
//获取get 还是post请求
var method=req.method.toLowerCase();
//console.log(method);
var pathname=url.parse(req.url,true).pathname;
if(pathname=='/login'){ /*显示登录页面*/
ejs.renderFile('views/form.ejs',{
},function(err,data){
res.end(data);
})
}else if(pathname=='/dologin' &&method=='get'){ /*执行登录的操作*/
//get获取数据
console.log(url.parse(req.url,true).query);
res.end('dologin');
}else if(pathname=='/dologin' &&method=='post'){ /*执行登录的操作*/
var postStr='';
req.on('data',function(chunk){
postStr+=chunk;
})
req.on('end',function(err,chunk){
//res.end(postStr);
console.log(postStr);
fs.appendFile('login.txt',postStr+'\n',function(err){
if(err){
console.log(err);
return;
}
console.log('写入数据成功');
})
res.end("<script>alert('登录成功');history.back();</script>")
})
}else{
ejs.renderFile('views/index.ejs',{
},function(err,data){
res.end(data);
})
}
}).listen(8001);
http_router.js
var url = require('url');
/**
* 对resquest进行封装
*
* @param {*} res
*/
var packingRes = function (res) {
var end = res.end;
res.end = function (data, encoding, callback) {
if (data && !(data instanceof Buffer) && (typeof data !== 'function')) {
if (typeof data === 'object') {
data = JSON.stringify(data);
} else if (typeof data === 'number') {
data = data.toString();
}
}
end.call(res, data, encoding, callback);
};
res.send = function (data, type) {
res.writeHead(200,
{
'Access-Control-Allow-Origin': '*',
'Content-Type': 'text/' + (type || 'plain') + '; charset=UTF-8'
}
);
res.end(data);
};
res.sendImg = function (data, type, timeout) {
res.writeHead(200,
{
'Access-Control-Allow-Origin': '*',
'Content-Type': 'image/' + (type || 'png'),
'Content-Length': Buffer.byteLength(data),
'Cache-Control': 'max-age=' + (timeout || 5184000)
}
);
res.end(data);
};
return res;
};
/**
* 路由规则
*/
var route = function () {
var self = this;
this._get = {};
this._post = {};
/**
* 处理请求
*
* @param {*} req
* @param {*} res
*/
var handle = function (req, res) {
packingRes(res);
var Url = url.parse(req.url, true);
var pathname = Url.pathname;
if (!pathname.endsWith('/')) {
pathname = pathname + '/';
}
var query = Url.query;
var method = req.method.toLowerCase();
if (self['_' + method][pathname]) {
if (method == 'post') {
// 设置接收数据编码格式为 UTF-8
// req.setEncoding('utf-8');
var postData = '';
// 数据块接收中
req.on('data', function (postDataChunk) {
postData += postDataChunk;
});
// 数据接收完毕,执行回调函数
req.on('end', function () {
try {
postData = JSON.parse(postData);
} catch (e) { }
req.query = postData;
self['_' + method][pathname](req, res);
});
} else {
req.query = query;
self['_' + method][pathname](req, res);
}
} else {
res.send(method + '请求路由地址不存在:' + pathname);
}
};
/**
* 注册get请求
*/
handle.get = function (string, callback) {
if (!string.startsWith('/')) {
string = '/' + string;
}
if (!string.endsWith('/')) {
string = string + '/';
}
self._get[string] = callback;
};
/**
* 注册post请求
*/
handle.post = function (string, callback) {
if (!string.startsWith('/')) {
string = '/' + string;
}
if (!string.endsWith('/')) {
string = string + '/';
}
self._post[string] = callback;
};
return handle;
};
module.exports = function () {
return new route();
};
demo.js
var route = require('./model/http-route.js');
var app = route();
var http = require('http');
var server = http.createServer(app);
app.get('/', function (req, res) {
res.send('首页');
});
app.get('/login', function (req, res) {
res.send('login');
});
app.get('/register', function (req, res) {
res.send('register');
});
app.post('/test', function (req, res) {
console.log('POST', req.query);
res.send(req.query);
});
server.listen(8080, function () {
console.log('listen ' + server.address().port);
});