Node.js学习——Express使用中间件

中间件:就是匹配路由之前和匹配路由之后做的一系列的操作。
中间件可以用来做权限判断:没有登录跳转到登录页面,登录以后就显示登录以后的页面。
Express 应用可使用如下几种中间件:应用级中间件、路由级中间件(用的比较少)、错误处理中间件、内置中间件、第三方中间件。
中间件,除了能够访问请求对象req和响应对象res,还有一个next参数。
next()将控制权交给下一个中间件,调用下一个函数。
如果没有next()的话,就不再调用下一个函数了。
如果当前的中间件没有调用next(),也没有结束请求-响应的周期,请求将会被挂起。

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

// 内置中间件
/* 
    从版本4.x开始,Express不再依赖Content,也就是说Express以前的内置中间件作为单独模块,express.static是Express的唯一内置中间件。
    
    express.static(root, [options]); 
    
    通过express.static我们可以指定要加载的静态资源。root代表加载静态资源的路径,options作为可选参数拥有以下属性:
        dotfiles    是否对外输出文件名以点(.)开头的文件。有效值包括“allow”、“deny”和“ignore”
        etag    启用或禁用 etag 生成
        extensions  用于设置后备文件扩展名
        index   发送目录索引文件。设置为 false 可禁用建立目录索引
        lastModified    将 Last-Modified 的头设置为操作系统上该文件的上次修改日期。有效值包括 true 或 false
        maxAge  设置 Cache-Control 头的 max-age 属性(以毫秒或者 ms 格式中的字符串为单位)
        redirect    当路径名是目录时重定向到结尾的“/”
        setHeaders  用于设置随文件一起提供的 HTTP 头的函数
 */
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、应用级中间件 (自定义一个获取时间戳的中间件)
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('执行新增新闻');
    next()
})

app.get('/news/:id',(req,res)=>{
    var id = req.params['id'];
    res.send('动态路由'+id)
})
//3、错误处理中间件  /css/base.css
// 即使不需要next参数,也必须要声明,否则会被识别为普通中间件,不能处理错误
// 错误中间件需要放在所有中间件、路由函数的后面才可以生效
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参数
    var body = req.body;
    console.log(body);
    res.send('获取传值'+body.username)
})

app.listen(3000)

说明
使用第三方中间件时一般在npm官网上找相关的配置
使用Express获取get传值一般使用的是req.query
使用Express获取post参数时一般通过第三方中间件body-parser,获取传值一般使用req.body

你可能感兴趣的:(Node.js学习——Express使用中间件)