中间件:就是匹配路由之前和匹配路由之后做的一系列的操作。
中间件可以用来做权限判断:没有登录跳转到登录页面,登录以后就显示登录以后的页面。
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
网友评论