Express学习笔记(基本使用,中间件,模块化路由,请求处理)
express筆記
這里不再提及express的定義或者作用等。
1.安裝
使用 npm install express (--save) 進行安裝
2.基本使用
1)開啟服務器
const express= require('express'); const app = express(); app.listen(3000);2)接收get請求
send()方法:
3.中間件
1)什么是中間件
中間件就是一堆方法,可以接收客戶端發來的請求,可以對請求做出響應,也可以將請求繼續交給下一個中間件繼續處理。
中間件主要由兩部分構成:中間件方法和請求處理函數。
中間件方法由Express提供,負責攔截請求,請求處理函數由開發人員提供,負責處理請求。
2)中間件處理請求
可以針對同一個請求設置多個中間件,對同一個請求進行多次處理。
默認情況下,請求從上到下依次匹配中間件,一旦匹配成功,終止匹配。
可以調用next方法將請求的控制權交給下一個中間件,直到遇到結束請求的中間件:
app.get('/request',(req,res,next)=>{req.name='Jack';next(); //使用next繼續向下執行 }) app.get('/request',(req,res)=>{res.send(req.name); //傳回req.name,值是上一個中間件設置的 })3)app.use中間件用法
app.use 匹配所有的請求方式,可以直接傳入請求處理函數,代表接收所有的請求。
app.use((req,res,next)=>{console.log(req.url);next(); })app.use 第一個參數也可以傳入請求地址,代表不論什么請求方式,只要是這個請求地址就接收這個請求。
app.use('/admin',(req,res,next)=>{console.log(req.url);next(); })4)中間件的應用
路由保護??蛻舳嗽谠L問需要登錄的頁面時,可以先使用中間判斷用戶登錄狀態,用戶如果未登錄,則攔截請求,直接響應,禁止用戶進入需要登錄的頁面。
app.use('/admin',(req,res,next)=>{let isLogin=false; if(isLogin) //如果登錄狀態正確,執行下一個請求next();elseres.send('您還沒有登錄,不能訪問該頁面') }) app.get('/admin',(req,res)=>{res.send('您已登錄,可以訪問當前頁面') })網站維護公告。在所有路由的最上面定義接收所有請求的中間件,直接為客戶端做出響應:網站正在維護中。
//網站公告 app.use((req,res,next)=>{res.send('當前網站正在維護...') }) //因為沒有next(),后續所有請求不會執行自定義404頁面。
app.use((req,res,next)=>{//為客戶端響應404狀態碼以及提示信息res.status(404).send('當前訪問的頁面不存在') })5)錯誤處理中間件
在程序執行的過程中,不可避免地會出現一些無法預料的錯誤,比如文件讀取失敗,數據庫鏈接失敗。
錯誤處理中間件是一個集中處理錯誤的地方。
簡單的例子:
app.get('/index',(req,res)=>{throw new Error('程序發生未知錯誤');//這里拋出一個錯誤 })//錯誤處理中間件 app.use((err,req,res,next)=>{res.status(500).send(err.message);//err對象接收錯誤,message屬性即拋出錯誤的信息 })讀取文件錯誤的例子:
const fs=require('fs');app.get('/index',(req,res,next)=>{fs.readFile('./demo.txt','utf8',(err,res)=>{if(err)next(err) //傳入err參數,如果出錯執行錯誤處理中間件else res.send(res)}) })//錯誤處理中間件 app.use((err,req,res,next)=>{res.status(500).send(err.message); })6)捕獲錯誤
node.js中,異步API的錯誤信息都是通過回調函數獲取的,支持Promise對象的異步API發生錯誤可以通過catch方法捕獲。
異步函數執行如果發生錯誤要如何捕獲呢?
try catch 可以捕獲異步函數以及其他同步代碼在執行過程中發生的錯誤,但是不能捕獲其他類型的API發生的錯誤。
app.get('/',async(req,res,next)=>{ //使用async定義異步函數try{await User.find({name:'Jack'})} catch(ex){next(ex);} })4. 構建模塊化路由
1)基礎代碼
const express =require('express') //創建服務器 const app =express();//創建路由對象 const home = express.Router(); //將路由和請求路徑進行匹配 app.use('/home',home);//在home路由下繼續創建路由(二級路由) home.get('/index',()=>{// home/indexres.send('hello') }) //此時二級路由可以響應 /home/index2)多模塊
home.js
const home = express.Router(); home.get('/index',()=>{res.send('這是展示頁面') }); module.exports = home;admin.js
const admin = express.Router(); admin.get('/index',()=>{res.send('這是管理頁面') }); module.exports = admin;app.js
const home = require('./route/home.js'); const admin = require('./route/admin.js'); app.use('/home',home); app.use('/admin',admin);5.express請求處理
1)GET參數的獲取
Express框架中使用req.query即可獲取GET參數,框架內部會將GET參數轉化為對象并返回。
//接收地址欄中問號后面的參數 //例如: http://localhost:3000/?name=Jack&age=20 app.get('/',(req,res)=>{console.log(req.query);//-> {"name":"Jack","age":"20"} })2)POST參數的獲取
Express中接收post請求參數需要第三方包 body-parser。
//引入body-parser模塊 const bodyParser = require('body-parser'); //配置body-parse模塊 app.use(bodyParser.urlencoded({ extended:false })); //extended:false 方法內部使用querystring模塊處理請求參數的格式 //extended:true 方法內部使用第三方模塊qs處理請求參數的格式//接收請求 app.post('/add',(req,res)=>{//接收參數console.log(req.body); })3)Express路由參數
//在請求的路徑上使用 :id 表示接收一個參數,是一個對象,對象名為id app.get('/find/:id',(req,res)=>{console.log(req.params); }) //訪問localhost/find/123 //-> {id:123}//使用多個參數: app.get('/find/:id/:name/:age',(req,res)=>{});4)靜態資源處理
通過Express內置的 express.static 可以方便地托管靜態文件,例如img,css,JavaScript文件等。
app.use(express.static('public'))則此時就可以訪問public文件夾下的各種文件。
express-art-template模板引擎
為了使art-template模板引擎能夠更好和express框架配合,模板引擎官方在原有模板引擎的基礎上封裝了 express-art-template。
使用 npm install art-template express-art-template 命令進行安裝。
//1.告訴express框架使用什么模板引擎渲染什么后綴的模板文件//當渲染后綴為art的模板時,使用express-art-template app.engine('art',require('express-art-template')); //2.設置模板存放目錄 app.set('views',path.join(_dirname,'views')); //3.告訴express框架模板的默認后綴是什么//渲染模板時不寫后綴,默認拼接art后綴 app.set('view engine','art');app.get('/',(req,res)=>{//渲染模板res.render('index',{msg:'message'}); }) /* 這里做了四件事情:1. 拼接模板路徑2. 拼接模板后綴3. 哪一個模板和哪一個數據進行了拼接4. 將拼接結果響應給客戶端 */index.art文件
{{ msg }} 新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Express学习笔记(基本使用,中间件,模块化路由,请求处理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 待发箱outbox空间已满
- 下一篇: python数据类型和循环控制