一、概念
app.use([path],function)
- path:是路由的url,默認參數‘/’,意義是路由到這個路徑時使用這個中間件
- function:中間件函數
這個中間件函數可以理解爲就是function(request,response,next) - next():操作完代碼之後是否繼續往下操作
注:中間件寫時,要在當前的路由之前寫
二、分類
1.全局應用級中間件
App.js:
var express=require("express");
var app=new express();
app.set("view engine","ejs");
app.use(function(req,res,next){
console.log("我是應用級中間件");
next();
});
app.get("/",function(req,res){
res.render("login");
});
app.get("/index",function(req,res){
res.render("index",req.query);
});
app.listen(8100);
login.ejs:
<body>
<form method="GET" action="/index">
<ul>
<li>賬號:<input type="text" name="id"></li>
<li>密碼:<input type="text" name="pwd"></li>
<li><input type="submit" value="登錄"></li>
</ul>
</form>
</body>
index.ejs:
<body>
<div>系統主界面</div>
<div>賬號------<%=id%></div>
<div>密碼------<%=pwd%></div>
</body>
應用場景:緩存值
2.路由級中間件(匹配當前路由,在執行當前路由之前進行的操作)
App.js:
var express=require("express");
var app=new express();
var user=require("./user");
app.set("view engine","ejs");
app.use("/index",function(req,res,next){
var u=req.query;
if(u.id==user.id && u.pwd==user.pwd){
next();
}else{
res.render("login",{
isshow:true
});
}
});
app.get("/",function(req,res){
res.render("login",{
isshow:false
});
});
app.get("/index",function(req,res){
res.render("index",req.query);
});
app.listen(8100);
login.ejs:
<body>
<% if(isshow){%>
<div>賬號或密碼錯誤!</div>
<%}%>
<form method="GET" action="/index">
<ul>
<li>賬號:<input type="text" name="id"></li>
<li>密碼:<input type="text" name="pwd"></li>
<li><input type="submit" value="登錄"></li>
</ul>
</form>
</body>
index.ejs:
<body>
<div>系統主界面</div>
<div>賬號------<%=id%></div>
<div>密碼------<%=pwd%></div>
</body>
user.js:
module.exports={
id:12345,
pwd:121212
}
3.錯誤級中間件
後期維護時,錯誤日誌的打印:
var express=require("express");
var ejs=require("ejs");
var fs=require("fs");
var app=new express();
app.set("view engine","ejs");
app.get("/regest",function(req,res,next){
fs.readFile("./data.txt",function(err,data){
if(err){
next(err);
}
res.send(data);
});
});
//錯誤級中間件 在項目裏出現錯誤時執行的中間件
app.use(function(err,req,res,next){
console.error(err.stack); //報出錯誤的狀態碼及錯誤
fs.appendFile("./error/error.txt",err.stack+"\n",function(error){
if(err){
next(error);
return;
}
console.log("追加成功!");
});
console.log("我是錯誤級中間件");
res.status(404).render("err");
});
app.listen(8100);
當前路由不存在,渲染404頁面出去:
app.use(function(req,res,next){
console.log("我是錯誤級中間件2");
res.status(404).render("error");
});
4.第三方中間件
(1)body-parser
- 安裝:
cnpm install body-parser --save
- 引入API:
var bodyParser=require("body-parser");
- 配置express框架,使用body-parser
//解析application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({extended:false}));
//解析application/json
app.use(bodyParser.json());
- 在使用第三方中間件body-parser獲取post提交數據,直接使用req.body就可直接獲取到json數據
//post路由接收傳值
app.post("/userlogin",function(req,res,next){
console.log(req.body);
res.render("success");
});
- 完整代碼
App.js:
var express=require("express");
var ejs=require("ejs");
var app=new express();
var bodyParser=require("body-parser");
//配置express框架,使用body-parser
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
app.set("view engine","ejs");
app.use(express.static("static"));
app.get("/",function(req,res){
res.render("index",{
list:"首頁"
},function(err,str){
res.send(str);
});
});
//post路由接收傳值
app.post("/userlogin",function(req,res,next){
console.log(req.body);
res.render("success");
});
app.listen(8100);
index.ejs:
<body>
<div>我是<%=list%></div>
<form method="POST" action="/userlogin">
<ul>
<li>姓名:<input type="text" name="username"></li>
<li><input type="submit"></li>
</ul>
</form>
</body>
success.ejs:
<body>
<div>表單提交成功!</div>
</body>
(2)cookie-parser(寫入緩存的中間件)
- 安裝:
cnpm install cookie-parser --save
- 引入API:
var cookieParser=require("cookie-parser");
- 配置express框架:
app.use(cookieParser());
- 未設置簽名:
var express=require("express");
var ejs=require("ejs");
var app=new express();
app.set("view engine","ejs");
app.use(express.static("static"));
var cookieParser=require("cookie-parser");
app.use(cookieParser());
app.get("/setcookie",function(req,res){
//設置cookie、有效期、maxAge:時間
res.cookie("user","kun",{maxAge:10000});
res.send("設置cookie成功!");
});
app.get("/getcookie",function(req,res){
//獲取cookie
var user=req.cookies.user; //未加密的獲取方式
console.log(user);
res.send("獲取cookie成功!");
});
app.listen(8100);
- 設置簽名:
var express=require("express");
var ejs=require("ejs");
var app=new express();
app.set("view engine","ejs");
app.use(express.static("static"));
var cookieParser=require("cookie-parser");
app.use(cookieParser("123456"));
app.get("/setcookie",function(req,res){
//設置cookie、有效期、maxAge:時間、signed:設置簽名
res.cookie("user","kun",{maxAge:10000,signed:true});
res.send("設置cookie成功!");
});
app.get("/getcookie",function(req,res){
//獲取cookie
var user=req.signedCookies.user; //加密的獲取方式
console.log(user);
res.send("獲取cookie成功!");
});
app.listen(8100);