node.js (三) express中介軟體
express靜態資源託管
1.匯入express模組
const express = require("express");
2.建立伺服器
const app = express();
3.靜態資源託管
app.use(express.static('public'));
app.use(express.static('static'));
4.開啟監聽
app.listen(4399);
5 路由的使用
// 匯入express模組
const express = require("express" );
const querystring = require("querystring");
// 建立伺服器
const app = express();
// get請求資料 express已經封裝好了解析的方法 點query出來的就已經是物件
app.get("/search", (req,res) => {
console.log(req);
console.log(req.query);
res.send("/search");
})
app.post("/add", (req, res) => {
// 使用get的方式獲取引數 獲取不到 因為他不是在url傳資料
// console.log(req);
// console.log(req.query);
var str = "";
req.on("data", data => {
str += data;
})
req.on("end", () => {
console.log(str);
var data = querystring. parse(str);
console.log(data);
})
res.send("/add");
})
// 開啟監聽
app.listen(8848);
1
Express中介軟體
Express 是一個自身功能極簡,完全是由路由和中介軟體構成一個的 web 開發框架,從本質上來說,一個 Express 應用就是在呼叫各種中介軟體。
中介軟體(Middleware) 是一個函式,它可以訪問請求物件(request object (req)), 響應物件(response object (res)), 和 web 應用中處於請求-響應迴圈流程中的中介軟體,一般被命名為 next 的變數。
中介軟體的功能包括:
(1). 執行任何程式碼。
(2). 修改請求和響應物件。
(3). 終結請求-響應迴圈。
(4). 呼叫堆疊中的下一個中介軟體。
如果當前中介軟體沒有終結請求-響應迴圈,則必須呼叫 next() 方法將控制權交給下一個中介軟體,否則請求就會掛起。
Express 應用可使用如下幾種中介軟體:
(1). 應用級中介軟體
(2). 路由級中介軟體
(3). 錯誤處理中介軟體
(4). 內建中介軟體
(5). 第三方中介軟體
使用可選則掛載路徑,可在應用級別或路由級別裝載中介軟體,另外,你還可以同時裝在一系列中介軟體函式,從而在一個掛載點上建立一個子中介軟體棧。
app.use(url, (req, res, next)=>{
//中介軟體要執行的程式碼
//呼叫下一個中介軟體或路由
next( );
})
const express = require("express");
const app = express();
app.use("/",(req,res,next)=>{
console.log("中介軟體")
let {token} = req.query;
if(token){
next() // 是否繼續往下執行
}else{
res.send("缺少token")
}
})
// test1介面
app.get("/test1",(req,res) => {
console.log('test1');
res.send(`test1 token為${req.query.token}`)
})
// test2介面
app.get("/test2",(req,res) => {
console.log('test2');
res.send(`test2 token為${req.query.token}`)
})
// 開啟伺服器
app.listen(2000,() => {
console.log('開啟在2000埠');
})
瀏覽器中訪問/test1 不帶token欄位
現在帶上token欄位訪問/test2
這就實現了通過中介軟體做全域性攔截,這種中介軟體屬於自定義攔截器.如果app.use()的第一個引數是 / 表示路徑,則第一個引數可以不寫,如下
app.use("/",(req,res,next)=>{
next() // 是否繼續往下執行
})
等同於
app.use((req,res,next)=>{
next() // 是否繼續往下執行
})
為什麼說這一種是全域性的 ,因為所有的介面都走這裡 接下來看區域性中介軟體
區域性中介軟體
第一個引數還是路徑 第二個引數是一個function 第三個引數還是function
const express = require("express");
const app = express();
app.get("/demo",(req,res,next) => {
console.log('fun1');
},(req,res) => {
console.log('fun2');
})
// 開啟伺服器
app.listen(2000,() => {
console.log('開啟在2000埠');
})
現在請求/demo介面 瀏覽器中沒有響應 因為第一個回撥函式裡沒有next() 不會走到第二個回撥函式裡
終端列印
const express = require("express");
const app = express();
app.get("/demo",(req,res,next) => {
console.log('fun1');
next()
},(req,res) => {
res.send("fun2")
console.log('fun2');
})
// 開啟伺服器
app.listen(2000,() => {
console.log('開啟在2000埠');
})
瀏覽器中訪問/demo
終端列印
這種叫區域性中介軟體,區域性中介軟體是 在哪個接口裡寫就只對哪個介面有用,區域性中介軟體可以寫無數個 只要在合適的地方使用next()就可以一個接一個的往下執行,一般情況下使用區域性中介軟體最多使用一兩個就夠了 使用多個區域性中介軟體 程式碼結構如下