Express
1. Express框架简介
1.1 简介
Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助开发者创建各种web应用,可以使用npm install express命令下载安装。
1.2 特性
- 提供了方便简洁的路由定义方式
- 对获取HTTP请求参数进行了简化处理
- 对模板引擎支持程度高,方便渲染动态HTML页面
- 提供了中间件机制,有效控制HTTP请求
- 拥有大量第三方中间件对功能进行扩展
1.3 基本用法
1.引入express
const express = require('express')
2.创建应用对象
const app = express();
3.创建路由规则
- request是对请求报文的封装
- response是对响应报文的封装
app.get('/',(request,response)=>{
// 设置响应
response.send('Hello Express!');
}
4.监听端口启动服务
app.listen(8000,()=>{
console.log("服务已经启动,8000端口监听中......");
}
2. 中间件
2.1 简介
中间件:就是一堆方法,可以接受客户端发来的请求,可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理。
中间件主要由两部分构成:中间件方法以及请求处理函数。
中间件方法由Express提供,负责拦截请求,请求处理函数由开发人员提供,负责处理请求。
可以针对同一个请求设置多个中间件,对同一个请求进行多次处理;默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。
可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间件。
app.get('/request',(request,response,next)=>{
// 设置响应
request.name="horizon";
});
app.get('/request',(request,response)=>{
// 设置响应
response.send(request.name);
})
2.2 app.use
app.use匹配所有的请求方式,可以直接传入请求处理函数,代表接受所有的请求。
app.use((req,res,next)=>{
console.log(req.url);
next();
})
app.use第一个参数也可以传入请求地址,代表不论什么请求方式,只要是这个请求地址就接收这个请求。
app.use('/admin',(req,res,next)=>{
console.log(reg.url);
next();
})
2.3 中间件应用
- 路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登录的页面
- 网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中
- 404页面
//引入express框架
const express = require('express');
//创建网站服务器
const app = express();
//网站维护
//app.use((request,response,next)=>{
// response.send('当前网站正在维护中...')
//})
app.use('/admin',(request,response,next)=>{
// 用户没有登录
let isLogin = true
//如果用户登录了
if (isLogin){
//请求继续向下执行
next()
}else {
// 如果用户没有登录,对客户端做出响应
response.send('你还没有登录,不能访问admin页面')
}
})
app.get('/admin',(request,response)=>{
response.send('你已经成功登录')
})
//404
app.use((request,response,next)=>{
response.status(404)
response.send('404')
})
//监听端口
app.listen(3000)
console.log('网站服务器启动成功。')
2.4 错误处理中间件
在程序执行的过程中,不可避免的出现一些无法预料的错误,比如文件读取失败,数据库连接失败,错误处理中间件是一个集中处理错误的地方
//引入express框架
const express = require('express');
const fs = require('fs')
//创建网站服务器
const app = express();
app.get('/index',(req,res,next)=>{
// throw new Error('未知错误')
// res.send('正常执行')
fs.readFile('./文件清单.txt','utf8',(err,result)=>{
if (err!=null){
next(err)
}else {
res.send(result)
}
})
})
//错误处理中间件
app.use((err,req,res,next)=>{
res.status(500).send(err.message)
})
//监听端口
app.listen(3000)
console.log('网站服务器启动成功。')
2.5 捕获错误
在nodejs中,异步API的错误信息都是通过回调函数获取的,支持Promise对象的异步API发生错误可以通过catch方法捕获。异步函数执行如果发生错误可以使用try catch捕获。
try catch可以捕获异步函数以及其他同步代码在执行过程中发生的错误
app.get("/",async(req,res,next)=>{
try{
await User.find({name:'张三'})
}catch(ex){
next(ex)
}
})
3.Express请求处理
3.1 构建模块化路由
// admin.js
const express = require('express')
//设置路由
const admin= express.Router()
admin.get('/index',(request,response)=>{
response.send("欢迎来到admin页") // 路径为/admin/index
})
//暴露模块
module.exports = admin
//home.js
const express = require('express')
const home = express.Router()
home.get('/index',(request,response)=>{
response.send("欢迎来到home页") // 路径为/home/index
})
module.exports = home
//run.js
const express = require('express')
const app = express()
const home = require('./route/home.js')
const admin = require('./route/admin.js')
app.use('/home',home)
app.use('/admin',admin)
app.listen(3000)
console.log("端口3000已启动.......")
3.2 GET参数的获取
Express框架中使用req.query即可获取GET参数,框架内部会将GET参数转换为对象返回
const express = require('express')
const app = express()
app.get('/index',(request,response)=>{
//http://localhost:3000/index?name=zhangsan&age=23
response.send(request.query) //{"name":"zhangsan","age":"23"}
})
app.listen(3000)
3.3 POST参数的获取
Express中接收post请求需要借助第三方包,body-parser
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
//拦截所有请求
//extended:false 方法内部使用querystring模块处理请求参数的格式
//extended:true 方法内部使用第三方模块qs处理请求参数的格式
app.use(bodyParser.urlencoded({extended:false}))
app.post('/add',(request,response)=>{
response.send(request.body)
})
app.listen(3000)
3.3 express路由参数
const express = require('express')
// const bodyParser = require('body-parser')
const app = express()
//设置路由参数
app.get('/index/:id/:name',(req,res)=>{
//接收post请求参数
res.send(req.params)
})
app.listen(3000)
console.log('端口3000已启动')
3.4 静态资源的处理
通过Express内置的express.static可以方便地托管静态文件,例如img,css,JavaScript文件等。
app.use(express.static('pubilc'));
4.模板引擎
- 为了使art-template模板引擎能够更好的和Express框架配合,模板引擎官方在原art-template模板引擎的基础上封装了express-art-template
- 使用
npm install art-template express-art-template命令进行安装
const express = require('express')
const path = require('path')
const app = express();
// 当渲染后缀为art的模板时,使用express-art-template
//参数: 1.模板后缀 2.使用的模板引擎
app.engine('art',require('express-art-template'))
//告诉express框架模板存放的位置是什么
app.set('views',path.join(__dirname,'views'))
//告诉express框架模板的默认后缀是什么
app.set('view engine','art')
app.get('/index',(req,res)=>{
//render: 渲染模板
// 1.拼接模板路径 2.拼接模板后缀 3.哪一个模板和哪一个数据进行拼接
// 4. 将拼接结果响应给客户端
res.render('index',{
msg:'message'
})
})
//要有list.art index.art两个文件
app.get('/list',(req,res)=>{
res.render('list',{
msg:'list page'
})
})
app.listen(3000)
app.local对象:将变量设置到app.locals对象下面,这个数据在所有的模板中都可以获取到
//共有属性
app.locals.users=[{
name:'zhangsan',
age:20
},{
name:'lisi',
age:30
}]
这份笔记是在学习黑马express的过程中搞出来的...