目录
一、express 介绍
express 是一个基于 Nodejs 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs.com.cn/简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发WEB 应用(HTTP 服务)
二、express 使用
大家可以按照这个步骤进行操作:
// 1.导入express
const express = require('express');
// 2.创建express实例
const app = express();
// 3.配置路由
app.get('/home', (req, res) => {
res.send('这是首页');
})
// 4.监听端口
app.listen(3000, () => {
console.log('服务器启动成功');
})
三、express路由
3.1 什么是路由
官户定义:路由确定了应用程序如何响应客户端对特定端点的请求
3.2 路由的使用
一个路由的组成有 请求方法, 路径 和 回调函数 组成
express 中提供了一系列方法,可以很方便的使用路由,使用格式如下:
app.<method>(path,callback)
代码示例:
// 1.导入express
const express = require('express');
// 2.创建express实例
const app = express();
// 3.配置路由
app.get('/home', (req, res) => {
res.send('这是首页');
})
app.get('/', (req, res) => {
res.send('这是真正的首页');
})
app.post('/login', (req, res) => {
res.end('login');
})
//匹配所有请求方法
app.all('/test', (req, res) => {
res.end('test');
})
//404
app.all('/*', (req, res) => {
res.end('404');
})
// 4.监听端口
app.listen(3000, () => {
console.log('服务器启动成功');
})
3.3 获取请求参数
express 框架封装了一些 API 来方便获取请求报文中的数据,并且兼容原生 HTTP 模块的获取方式
// 导入express
const express = require('express');
// 创建express实例
const app = express();
// 配置路由
app.get('/request', (req, res) => {
//原生操作
// console.log(req.method);
// console.log(req.url);
// console.log(req.httpVersion);
// console.log(req.header);
// //express 操作
// console.log(req.path);
// console.log(req.query);
// //获取ip
// console.log(req.ip);
//获取请求头
console.log(req.get('host'));
res.send('这是首页');
})
// 监听端口
app.listen(3000, () => {
console.log('服务器启动成功');
})
3.4 获取路由参数
路由参数指的是 URL 路径中的参数(数据)
app.get('/:id.html',(req,res)=> {
res.send('商品详情,商品 id 为' + req.params.id);});
// 导入express
const express = require('express');
// 创建express实例
const app = express();
// 配置路由
app.get('/:id.html', (req, res) => {
//获取路由参数
const id = req.params.id;
console.log(id);
// 设置响应头
res.setHeader('Content-Type', 'text/html;charset=utf8');
res.send('商品详情');
})
// 监听端口
app.listen(3000, () => {
console.log('服务器启动成功');
})
四、express 响应设置
express 框架封装了一些 API 来方便给客户端响应数据,并且兼容原生 HTTP 模块的获取方式
//导入 express
const express = require('express');
//创建应用对象
const app = express();
//创建路由
app.get('/response', (req, res) => {
//原生响应
// res.statusCode = 404;
// res.statusMessage = 'love';
// res.setHeader('xxx', 'yyy');
// res.write('hello express ')
// res.end('response');
//express 响应
// res.status(500);
// res.set('aaa','bbb');
// res.send('你好 Express');
res.status(500).set('abc','def').send('这都是 OK 的');
});
//监听端口, 启动服务
app.listen(3000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
其他响应
//导入 express
const express = require('express');
//创建应用对象
const app = express();
//创建路由
app.get('/other', (req, res) => {
//跳转响应
// res.redirect('http://atguigu.com');
//下载响应
// res.download(__dirname + '/package.json');
// JSON 响应
// res.json({
// name: '尚硅谷',
// slogon: '让天下没有难学的技术'
// })
//响应文件内容
res.sendFile(__dirname + '/test.html');// path.resolve()
});
//监听端口, 启动服务
app.listen(3000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
五、快递中间件
5.1 什么是中间件
中间件(Middleware)本质是一个回调函数
中间件函数可以像路由回调一样访问请求对象(request),响应对象(response)
5.2 中间件的作用
中间件的作用就是使用函数封装公共操作,简化代码
5.3 中间件的类型
- 全局中间件
- 路由中间件
5.3.1 定义全局中间件
每一个请求到达服务端之后都会执行全局中间件函数
- 全局中间件
/**
* 记录每个请求的 url 与 IP 地址
*/
//导入 express
const express = require('express');
const fs = require('fs');
const path = require('path');
//创建应用对象
const app = express();
//声明中间件函数
function recordMiddleware(req, res, next){
//获取 url 和 ip
let {url, ip} = req;
//将信息保存在文件中 access.log
fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url} ${ip}\r\n`);
//调用 next
next();
}
//使用中间件函数
app.use(recordMiddleware);
//创建路由
app.get('/home', (req, res) => {
res.send('前台首页');
});
app.get('/admin', (req, res) => {
res.send('后台首页');
});
app.all('*',(req, res) => {
res.send('<h1>404 Not Found</h1>')
})
//监听端口, 启动服务
app.listen(3000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
- 路由中间件
/**
* 针对 /admin /setting 的请求, 要求 URL 携带 code=521 参数, 如未携带提示『暗号错误』
*/
//导入 express
const express = require('express');
//创建应用对象
const app = express();
//创建路由
app.get('/home', (req, res) => {
res.send('前台首页');
});
//声明中间件
let checkCodeMiddleware = (req, res, next) => {
//判断 URL 中是否 code 参数等于 521
if(req.query.code === '521'){
next();
}else{
res.send('暗号错误');
}
}
//后台
app.get('/admin', checkCodeMiddleware, (req, res) => {
res.send('后台首页');
});
//后台设置
app.get('/setting', checkCodeMiddleware, (req, res) => {
res.send('设置页面');
});
app.all('*',(req, res) => {
res.send('<h1>404 Not Found</h1>')
})
//监听端口, 启动服务
app.listen(3000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
- 静态资源中间件
//导入 express
const express = require('express');
//创建应用对象
const app = express();
//创建路由
app.get('/', (req, res) => {
res.send('我才是首页~~~');
});
//静态资源中间件设置
app.use(express.static(__dirname + '/public'));
//监听端口, 启动服务
app.listen(3000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})
5.4 获取请求数据
express 可以使用 body-parser包处理请求体
第一步:安装
npm i body-parser
第二步:导入body-parser包
const bodyParser =require('body-parser');
第三步:获取中间件函数
第四步:设置路由中间件,然后使用 request.body 来获取请求体数据
/**
* 按照要求搭建 HTTP 服务
*
* GET /login 显示表单网页
* POST /login 获取表单中的『用户名』和『密码』
*/
//导入 express
const express = require('express');
const bodyParser = require('body-parser')
//创建应用对象
const app = express();
//解析 JSON 格式的请求体的中间件
// const jsonParser = bodyParser.json()
//解析 querystring 格式请求体的中间件
const urlencodedParser = bodyParser.urlencoded({ extended: false })
//创建路由规则
app.get('/login', (req, res) => {
// res.send('表单页面')
//响应 HTML 文件内容
res.sendFile(__dirname + '/11_form.html');
});
//post 规则
app.post('/login', urlencodedParser, (req, res) => {
//获取 用户名 和 密码
console.log(req.body);
res.send('获取用户的数据')
});
//启动服务
app.listen(3000, () => {
console.log('server is running...');
})
六、 防盗链
//导入 express
const express = require('express');
//创建应用对象
const app = express();
//声明中间件
app.use((req, res, next) => {
//检测请求头中的 referer 是否为 127.0.0.1
//获取 referer
let referer = req.get('referer');
if (referer) {
//实例化
let url = new URL(referer);
//获取 hostname
let hostname = url.hostname;
//判断
if (hostname !== '127.0.0.1') {
//响应 404
res.status(404).send('<h1>404 Not Found</h1>');
return;
}
}
next();
});
//静态资源中间件设置
app.use(express.static(__dirname + '/public'));
//监听端口, 启动服务
app.listen(3000, () => {
console.log('服务已经启动, 端口 3000 正在监听中....')
})