中間件
- 瀏覽器向服務器發請求,中間件攔截請求並作出響應;中間件最終是要爲路由服務的。
- 分爲五類:應用級中間件、路由級中間件、內置中間件、第三方中間件、錯誤處理中間件(瞭解)。
- 應用級中間件
- 也稱爲自定義中間件,就是一個函數
app.use(URL,callback);
URL
:表示要攔截哪一個路由,對應路由中的URLcallback
:攔截到以後,自動調用req
:請求的對象res
:響應的對象next
:是一個函數,表示執行一下一個中間件或路由
//創建中間件,攔截對/list的請求,如果提供的用戶名爲root,則允許查看後臺數據,否則響應‘無此權限’ //參數1:攔截的URL //參數2:攔截到以後,執行的回調函數,在回調函數中可以獲取到請求,以及做出響應 app.use('/list',function(req,res,next){ //req請求對象 //獲取查詢字符串傳遞的數據 console.log(req.query); //res響應對象 //判斷數據是否爲root,如果不是root,則響應無此權限,否則允許往後執行(可能有其他中間件,也可能是路由) if(req.query.uname!=='root'){ res.send('無此權限'); }else{ //執行下一個中間件或路由 next(); } }); //獲取後臺數據的路由(get /list ) app.get('/list',(req,res)=>{ res.send('這是後臺的數據'); });
練習:創建購物車路由,(get /shopping),傳遞商品的價格price,在中間件中將價格打九折,最後在路由中響應‘商品價格:xxx’
- 路由級中間件
路由器的使用 - 內置中間件
express中當前只有一個內置中間件:託管靜態資源(服務器吧所有的靜態資源(html,css等)託管到指定的目錄下,如果瀏覽器端要請求文件,不需要再裝進路由,自動到該目錄下查找)
app.use( express.satic('目錄名稱') );
//託管靜態資源 //把所有靜態資源託管到public下,瀏覽器請求自動到這個目錄下查找 app.use(express.static('public')); //練習:託管靜態資源到file目錄下,查看如果和public有相同的文件名稱,哪一個起作用 app.use(express.static('files'));//先託管的先起作用
練習:託管靜態資源到file目錄下,查看如果和public有相同的文件名稱,哪一個起作用
練習:創建web服務器,託管靜態資源到public目錄,在該目錄下創建登錄的網頁login.html,點擊登錄按鈕,向服務器發請求(post/mylogin),在路由中獲取數據。
- 第三方中間件使用
- 第三方中間件都是以第三方模塊的形式出現,需要先下載安裝,
express
在下載安裝的時候回附帶下載一些第三方中間件 body-parse
的使用:
//1.引入中間件 const bodyParser=require('body-parser'); //2.使用中間件(在路由之前) app.use( bodyParser.urlencoded({ extended:false//不使用第三方的qs模塊解析爲對象,而是使用querystring這個核心模塊 }) ); //3.在路由種獲取數據,格式爲對象 req.body
- 第三方中間件都是以第三方模塊的形式出現,需要先下載安裝,
mysql模塊
- 連接數據庫
mysql.exe -h127.0.0.1 -P3306 -uroot -p
mysql -uroot
mysql -uroot<腳本文件地址
- 回顧mysql的增刪改查
insert into emp values();
delete from emp where eid=5;
update emp set phone='...',sex=0 where eid=5;
select * from emp;
- 下載安裝mysql第三方模塊
npm install mysql
- 使用mysql模塊連接mysql數據庫
mysql.createConnection()
普通連接//普通連接 //引入mysql模塊 const mysql=require('mysql'); //創建連接對象 const connection=mysql.createConnection({ host:'127.0.0.1', port:'3306', user:'root', password:'', database:'tedu'//連接後要進入的數據庫 }); //執行連接 connection.connect(); //執行sql命令 //參數1:執行的命令 //參數2:獲取sql命令的執行結果 connection.query('select * from emp;',function(err,result){ //err可能產生的錯誤 if(err)throw err; //result執行的結果 console.log(result); });
mysql.createPool()
連接池(推薦)//連接池連接 //引入mysql模塊 const mysql=require('mysql'); //創建連接池對象 const pool=mysql.createPool({ host:'127.0.0.1', port:'3306', user:'root', password:'', database:'tedu', connectionLimit:'15'//設置連接池的大小,默認也是15 });
- 執行sql語句
pool.query(sql,arr,callback)
sql
:要執行的sql語句
arr
:要過濾的數據,會替換sql語句中佔位符(?)
callback
:回調函數,用於獲取sql語句的結果
err
:可能出現的錯誤
result
:sql語句的結果//執行sql語句,會自動建立連接 //sql注入,用戶在提供的數據中加入了sql命令 //如何避免:過濾用戶提供的數據[arr]就是過濾,然後在傳到(?)佔位符處 //練習:創建對象,修改對象中提供的列 let emp={ ename:'jin', birthday:'1900-1-1', salary:999999, eid:16 }; pool.query('update emp set ? where eid=?',[emp,emp.eid],(err,result)=>{ if(err)throw err; console.log(result); });
練習:查詢是否登錄成功,到數據庫查詢有沒有用戶名和密碼同時匹配的數據,如果有,登錄成功
練習:創建web服務器,託管靜態資源到public目錄下, 包含文件add.html(添加部門操作),想服務器發送請求(get /add);創建對應的路由,在路由中獲取傳遞的數據,把數據插入到tedu數據庫下的dept表中。如果插入成功,響應‘部門添加成功’