Node 中間件

一、概念

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章