从字面意思,我们可以了解到中间件大概就是做中间代理操作,事实也是如此。大多数情况下,中间件就是在做接收到请求和发送响应中间的一系列操作。
事实上,Express是一个路由和中间件的web框架,Express应用程序基本上是一系列中间件函数的调用。
中间件函数可以执行以下任务:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求/响应循环。
- 调用堆栈中的下一个中间件函数。
中间件也分为应用层中间件、路由中间件、内置中间件、错误处理中间件和第三方中间件。
应用层中间件
应用级中间键绑定到 app对象,使用 app.use()和app.NETHO()(需要处理http请求的方法,例如GET、PUT、POST),将之前的get或者post替换为use就行。
需要在集成终端中运行node,页面输入127.0.0.1:8888进行查询。
也可以将两个写一块,代码少,更简洁。
路由中间件
路由级中间件和应用级中间件类似,只不过他需要绑定express.Router();
const router = express.Router();
在匹配路由时,我们使用 router.use()或 router.VERB(),路由中间件结合多次 callback可用于用户登录及用户状态检测。
在集成终端中运行node,页面输入127.0.0.1:8888/user进行查询。
错误处理事件
在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败。
错误处理中间件是一个集中处理错误的地方。
首先定义错误处理中间件
// // 错误处理中间件
app.use((err,req,res,next) => {
res.status(500).send(err.message);
})
给客户响应500装填吗并将错误信息响应给客户端,
然后创建一个get路由请求,这里需要手动抛出一个错误。
// 手动搬出错误 throw new Error
app.get('index',(req,res) =>{
throw new Error('程序发生了未知错误~~');
})
完整代码:
const express = require('express');
const app = express();
const fs = require('fs');
// // 手动搬出错误 throw new Error
// app.get('index',(req,res) =>{
// throw new Error('程序发生了未知错误~~');
// })
// // 错误处理中间件
// app.use((err,req,res,next) => {
// res.status(500).send(err.message);
// })
// app.listen(3000,function(){
// console.log('Example app listening on port 3000');
// })
app.get('/index',(req,res,next) => {
// 读取文件
fs.readFile('./test.txt','utf-8',(err,data) => {
if(err){
next(err);
}else{
res.send(data);
}
})
})
// 错误处理中间件
app.use((err,req,res,next) => {
res.status(500).send(err.message);
});
app.use("/static",express.static("index.html"));
app.listen(8888);
内置中间件
从版本4.x开始,Express不再依赖Content,也就是说. Express以前的内置中间件作为单独模块,express.static是Express的唯一内置中间件。
express.static(root,[options]);
通过express.static我们可以指定要加载的静态资源。root代表加载静态资源的路径,options作为可选参数拥有一下属性:
属性 | 描述 | 类型 | 缺省值 |
dotfiles | 是否对外输出文件名以点(.)开头的文件。有效值包括"allow"、"deny"和"ignore". | 字符串 | "ignore" |
etag | 启用或禁用etag生成。 | 布尔 | true |
extensions | 用于设置后备文件扩展名。 | 数组 | [ ] |
index | 发送目录索引文件。设置为false可禁用建立目录索引。 | 混合 | "index.html" |
lastModified | 将Last-Modified的头设置为操作系统上该文件的上次修改日期。有效值包括true或false。 | 布尔 | true |
maxAge | 设置Cache-Control头的 max-age 属性(以毫秒或者ms格式中的字符串为单位)。 | 数字 | 0 |
readirect | 当路径名是目录时重定向到结尾的"/"。 | 布尔 | |
setHeaders | 用于设置随文件—起提供的HTTP头的函数。 | 函数 | true |
Cookie的使用
Cookie的特点:
- cookie保存在浏览器本地,只要不过期,关闭浏览器后也会存在。
- 正常情况下cookie 不加密,用户可轻松看到。
- 用户可以删除或者禁用cookie 功能。
- cookie 可以被篡改。
- cookie可用于攻击。
- cookie存储量很小,大小一般是4k。
- 发送请求自动带上登录信息。
cookie-parser的安装及使用
在文件的集成终端打开安装:
npm install cookie-parser --save
cookie的使用:
const express = require('express');
const app = express();
// 引入coolie
const cookieParser = require('cookie-parser');
// 设置中间件
app.use(cookieParser('secret'));
// 设置cookie drivers
app.get('/set',(req,res) => {
res.cookie('username','刘亦菲',{maxAge:30000,httpOnly:true,signed:'ture',domain:'ccc.com'});
res.send('cookie设置成功');
})
// 获取cookie
app.get('/get',(req,res) => {
const username = req.cookies.username;
if(username){
res.send(`获取到cookie的值:${username}`);
}else{
res.send("获取cookie失败");
}
})
app.listen(8080);