一.express介绍
express是一个基于Node.js平台的极简,灵活的WEB应用开发框架
简单来说,express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用(HTTP服务)
二.express使用
2.1.express下载
express本身是一个npm包,所以可以通过npm安装,有了这个包,我们在开发一些服务端应用时会相对简单,大大提升我们的开发效率
2.1.express初体验
代码示例
//1.导入express
const express=require('express')
// 2.创建应用对象
const app=express()
// 3.创建路由
app.get('/home',(req,res)=>{
res.end('home')
})
// 4.监听端口,启动服务
app.listen(3000,()=>{
console.log('3000端口服务已启动');
})
三.express路由
3.1.什么是路由
官方定义:路由确定了应用程序如何响应客户端对特定端点的请求
3.2.路由的使用
一个路由的组成有请求方法,路径和回调函数组成
express中提供了一系列方法,可以很方便的使用路由,使用格式如下
app.<method>(path,callback)
代码示例:
// 导入模块
const express=require('express')
// 创建应用
const app=express()
// 创建路由
app.get('/',(req,res)=>{
res.end('首页')
})
app.get('/home',(req,res)=>{
res.end('home')
})
app.get('/login',(req,res)=>{
res.end('login')
})
app.all('/test',(req,res)=>{
res.end('testtest')
})
// 托底的路由
app.all('*',(req,res)=>{
res.end('haha 404 not found')
})
// 监听端口,启动服务
app.listen(3030,()=>{
console.log('3030端口已启动');
})
3.3.获取请求参数
express框架封装了一些API来方便获取请求报文中的数据,并且兼容原生HTTP模块的获取方式
const express=require('express')
const app=express()
app.get('/request',(req,res)=>{
//原生方式
console.log(req.method);//GET
console.log(req.url);// /request
console.log(req.httpVersion);//1.1
console.log(req.headers);
// express操作
console.log(req.path);// /request
console.log(req.query);//{ a: '100', b: '200' }
//获取ip
console.log(req.ip)// ::ffff:127.0.0.1
// 获取请求头
console.log(req.get('host'));//127.0.0.1:3040
res.end('hello express')
})
app.listen('3040',()=>{
console.log('3040端口已启动');
})
3.4.获取路由参数
路由参数指的是URL路径中的参数(数据)
const express=require('express')
const app = express()
app.get('/:id.html',(req,res)=>{
const id=req.params.id
res.setHeader('content-type','text/html;charset=utf-8')
res.end('商品详情'+id)
})
app.listen('9000',()=>{
console.log('端口9000已启动');
})
四.express响应设置
express框架封装了一些API方便给客户端响应数据,并且兼容原生HTTP模块的获取方式
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('设置响应')
// express响应
// res.status(500)
// res.set('aaaa','bbbb')
// res.send('你好 express')
// express响应连贯操作
res.status(500).set('abc','def').send('这都是ok的')
})
app.listen(8000,()=>{
console.log('8000端口已启动');
})
其他响应设置
const express=require('express')
const app=express()
app.get('/response',(req,res)=>{
// 跳转
// res.redirect('http://www.baidu.com')
//下载响应
// res.download(__dirname+'/info.txt')
// jSON响应
// res.json({
// name:'菜市场',
// slogen:'买菜要买新鲜的'
// })
// 响应文件内容
res.sendFile(__dirname+'/test.html')
})
app.listen(8000,()=>{
console.log('8000端口已启动');
})
五.express中间件
5.1什么是中间件
中间件(Middleware)本质是一个回调函数
中间件函数可以像路由回调一样访问请求对象(request),响应对象(response)
5.2中间件的作用
中间件的作用就是使用函数封装公共操作,简化代码
5.3.中间件的类型
- 全局中间件
- 路由中间件
5.3.1定义全局中间件
每一个请求到达服务端之后都会执行全局中间件函数
声明中间件函数
const express=require('express')
const fs=require('fs')
const path=require('path')
const app=express()
function recordMiddleware(req,res,next){
let {url,ip}=req
fs.appendFileSync(path.resolve(__dirname,'./access.log'),`${url} ${ip}\r\n`)
next()
}
app.use(recordMiddleware)
app.get('/home',(req,res)=>{
res.end('前台首页')
})
app.get('/admin',(req,res)=>{
res.end('后台首页')
})
app.all('*',(req,res)=>{
res.write('页面找不到了')
})
app.listen('8090',()=>{
console.log('端口8090已开启');
})
5.3.2定义路由中间件
/**
需求,判断请求的url中是否有code=123,有则往下执行,没有就返回‘暗号错误’
*/
const express=require('express')
const app=express()
function checkedCodeMiddleWare(req,res,next){
if(req.query.code==='123'){
return next()
}
res.send('暗号错误')
}
app.get('/admin',checkedCodeMiddleWare,(req,res)=>{
res.send('后台首页')
})
app.get('/setting',checkedCodeMiddleWare,(req,res)=>{
res.send('设置首页')
})
app.all('*',(req,res)=>{
res.send('页面没有找到')
})
app.listen('8090',()=>{
console.log('8090端口已启动');
})
5.3.3.静态资源中间件
创建静态资源中间件,/public就是网站根目录,或者叫静态资源根目录,获取到url以后,静态资源中间件会根据路径参数去根目录中去找相关文件作为响应发给浏览器
注意事项:
1.index.html为默认打开的资源
2.如果是静态资源与路由规则同时匹配,谁先匹配谁就响应
3.路由响应动态资源,静态资源中间件响应静态资源