跳到主要内容

中间件

Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。

中间件(Middleware) 是一个函数,它可以访问请求对象(request), 响应对象(response), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。

功能

  • 执行任何代码
  • 修改请求和响应对象
  • 终结请求-响应循环
  • 调用堆栈中的下一个中间件

分类

  • 应用级中间件(过滤非法的请求,例如防盗链)
  • 第三方中间件(通过npm下载的中间件,例如body-parser)
  • 内置中间件(express内部封装好的中间件)
  • 路由器中间件 (Router)
const express = require('express');
const qs = require('querystring');
//创建应用对象
const app = express();
//① 引入body-parser
const bodyParser = require('body-parser');
// ② parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({extended: false}));

//简易的自定义请求体处理
let bodyParser1 = function (request, response, next) {
//获取请求体
let body = '';
request.on('data', chunk => {
body += chunk;
})
request.on('end', () => {
//解析
const data = qs.parse(body);
//将请求体对象作为属性存储到response对象中
request.body = data;
next();
})
}

//1、静态资源服务中间件()
app.use(express.static('./public'));

//请求体参数的获取 中间件 body-parser
app.get('/from', (request, response) => {
//将某个文件中的内容响应
response.sendFile(__dirname + '/form.html');
});

app.post('/login', (request, response) => {
//获取请求体 body-parser
//③ request.body 获取请求体中的某个属性
console.log(request.body.username);
console.log(request.body.password);
response.send('请求体接收完毕');
})

app.listen(80, () => {
console.log('服务已经启动,端口80监听中');
});
//中间件就是函数

const express = require('express');
const moment = require("moment");
const fs = require('fs');
const app = express();

//1、声明一个中间件函数 next是一个函数类型的值
let record = function (request, response, next) {
//获取时间
let time = moment().format('YYYY-MM-DD hh:mm:ss');
//获取路径
const path = request.url;
//拼接要写入的字符串
let str = `[${time}] ${path}\r\n`;
//写入文件
fs.writeFileSync('./access.log', str, {flag: 'a'});
//调用next函数
next();
};

//一、路由中间件 检测用户
let checkUser = function (request, response, next) {
//获取admin url 参数
let isAdmin = request.query.admin;
//判断
if (isAdmin === '1') {
//满足条件
next();
} else {
//跳转到登录页面
response.redirect('/login');
}
}

//2、使用中间件 中间件的配置(全局中间件)
app.use(record);

//路由
//将用户的请求记录在文件中 access.log [2022-1-14 10:10:10] /
app.get('/', (request, response) => {
response.send('中间件');
});

//路由规则 ?admin=1
//二、添加函数至第二个参数
app.get('/admin', checkUser, (request, response) => {
response.send('后台首页');
});

// ?admin=1
app.get('/setting', checkUser, (request, response) => {
response.send('后台设置');
});

app.get('/shuju', checkUser, (request, response) => {
response.send('后台数据');
});

app.get('/home', (request, response) => {
response.send('前端首页');
});

app.get('/cart', (request, response) => {
response.send('购物车');
});

app.get('/login', (request, response) => {
response.send('登录页面');
});

app.listen(80);