Node.js學(xué)習(xí)——Express使用中間件

中間件:就是匹配路由之前和匹配路由之后做的一系列的操作。
中間件可以用來做權(quán)限判斷:沒有登錄跳轉(zhuǎn)到登錄頁面,登錄以后就顯示登錄以后的頁面。
Express 應(yīng)用可使用如下幾種中間件:應(yīng)用級中間件、路由級中間件(用的比較少)、錯誤處理中間件、內(nèi)置中間件、第三方中間件。
中間件,除了能夠訪問請求對象req和響應(yīng)對象res,還有一個next參數(shù)。
next()將控制權(quán)交給下一個中間件,調(diào)用下一個函數(shù)。
如果沒有next()的話,就不再調(diào)用下一個函數(shù)了。
如果當(dāng)前的中間件沒有調(diào)用next(),也沒有結(jié)束請求-響應(yīng)的周期,請求將會被掛起。

const express = require('express');
const app = express();

// 內(nèi)置中間件
/* 
    從版本4.x開始,Express不再依賴Content,也就是說Express以前的內(nèi)置中間件作為單獨模塊,express.static是Express的唯一內(nèi)置中間件。
    
    express.static(root, [options]); 
    
    通過express.static我們可以指定要加載的靜態(tài)資源。root代表加載靜態(tài)資源的路徑,options作為可選參數(shù)擁有以下屬性:
        dotfiles    是否對外輸出文件名以點(.)開頭的文件。有效值包括“allow”、“deny”和“ignore”
        etag    啟用或禁用 etag 生成
        extensions  用于設(shè)置后備文件擴(kuò)展名
        index   發(fā)送目錄索引文件。設(shè)置為 false 可禁用建立目錄索引
        lastModified    將 Last-Modified 的頭設(shè)置為操作系統(tǒng)上該文件的上次修改日期。有效值包括 true 或 false
        maxAge  設(shè)置 Cache-Control 頭的 max-age 屬性(以毫秒或者 ms 格式中的字符串為單位)
        redirect    當(dāng)路徑名是目錄時重定向到結(jié)尾的“/”
        setHeaders  用于設(shè)置隨文件一起提供的 HTTP 頭的函數(shù)
 */
var options = {
  dotfiles: 'ignore',
  etag: false,
  extensions: ['htm', 'html'],
  index: false,
  maxAge: '1d',
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now());
  }
}
// app.use(express.static('static'), options)
app.use(express.static('static'))

//1、應(yīng)用級中間件 (自定義一個獲取時間戳的中間件)
function getTimestamp(req, res, next) {
    let t1 = Date.parse(new Date());
    let t2 = (new Date()).valueOf();
    let t3 = new Date().getTime();
    console.log(t1, t2, t3);
    next();
}
// 使用中間件
app.use(getTimestamp);

app.get('/',(req,res)=>{
    res.send('首頁')
})

app.get('/login',(req,res)=>{
    res.send('登錄頁')
})
//2、路由級中間件(用的比較少)
app.get('/news/add',(req,res,next)=>{
    console.log('執(zhí)行新增新聞');
    next()
})

app.get('/news/:id',(req,res)=>{
    var id = req.params['id'];
    res.send('動態(tài)路由'+id)
})
//3、錯誤處理中間件  /css/base.css
// 即使不需要next參數(shù),也必須要聲明,否則會被識別為普通中間件,不能處理錯誤
// 錯誤中間件需要放在所有中間件、路由函數(shù)的后面才可以生效
app.use((req,res,next)=>{
    res.status(404).send('404')
})

app.listen(3000)

第三方中間件

const express = require('express');
const bodyParser = require('body-parser')
const ejs = require('ejs')
const app = express();

app.engine('html', ejs.__express);
app.set('view engine','html');
// 配置第三方中間件
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.get('/login',(req,res)=>{ 
    // req.query 獲取get傳值
    res.render('index',{})
})

app.post('/doLogin',(req,res)=>{
    // req.body 獲取post參數(shù)
    var body = req.body;
    console.log(body);
    res.send('獲取傳值'+body.username)
})

app.listen(3000)

說明
使用第三方中間件時一般在npm官網(wǎng)上找相關(guān)的配置
使用Express獲取get傳值一般使用的是req.query
使用Express獲取post參數(shù)時一般通過第三方中間件body-parser,獲取傳值一般使用req.body

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容