从字面意思,我们可以了解到中间件大概就是做中间代理操作,事实也是如此。大多数情况下,中间件就是在做接收到请求和发送响应中间的一系列操作。

        事实上,Express是一个路由和中间件的web框架,Express应用程序基本上是一系列中间件函数的调用。

中间件函数可以执行以下任务:

  •         执行任何代码。
  •         对请求和响应对象进行更改。
  •         结束请求/响应循环。
  •         调用堆栈中的下一个中间件函数。

    中间件也分为应用层中间件、路由中间件、内置中间件、错误处理中间件和第三方中间件。

应用层中间件

        应用级中间键绑定到 app对象,使用 app.use()和app.NETHO()(需要处理http请求的方法,例如GET、PUT、POST),将之前的get或者post替换为use就行。

        需要在集成终端中运行node,页面输入127.0.0.1:8888进行查询。

es中间件可以存储关系型数据库数据吗 express 中间件_前端

 也可以将两个写一块,代码少,更简洁。

es中间件可以存储关系型数据库数据吗 express 中间件_es中间件可以存储关系型数据库数据吗_02

 路由中间件

路由级中间件和应用级中间件类似,只不过他需要绑定express.Router();

const router = express.Router();

 在匹配路由时,我们使用 router.use()或 router.VERB(),路由中间件结合多次 callback可用于用户登录及用户状态检测。

        在集成终端中运行node,页面输入127.0.0.1:8888/user进行查询。

es中间件可以存储关系型数据库数据吗 express 中间件_中间件_03

 错误处理事件

在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败。

错误处理中间件是一个集中处理错误的地方。

首先定义错误处理中间件

// // 错误处理中间件

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);