Express框架
一、Express框架
(1)定义
Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用。
使用 npm install express 命令进行下载。
(2)Express框架特性
① 提供了方便简洁的路由定义方式
② 对获取HTTP请求参数进行了简化处理
③ 对模板引擎支持程度高,方便渲染动态HTML页面
④ 提供了中间件机制有效控制HTTP请求
⑤ 拥有大量第三方中间件对功能进行扩展
二、基本使用步骤
(1)引入Express框架
let express = require('express')
(2)使用框架创建web服务器
通过express函数,创建并返回一个web服务器对象。
let app = express()
(3)程序监听端口
启动服务器,并监听一个端口号(端口号是自定义的)。
app.listen(8848,()=>{
console.log('服务器成功开启,端口号是8848');
})
(4)客户端访问路由
启动服务器,并监听一个端口号(端口号是自定义的)。
// 当客户端以get方式访问/路由时
app.get('/', (req, res) => {
// 对客户端做出响应,send方法会根据内容的类型自动设置请求头
res.send('Hello Express'); // <h2>Hello Express</h2> {say: 'hello'}
});
三、路由
路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。
(1)客户端以get方式访问 / 路由
app.get('/', (req, res) => {
// 对客户端做出响应
res.send('使用get方式请求了/路由'');
});
(2)客户端以post方式访问 /add 路由
app.post('/add', (req, res) => {
res.send('使用post方式请求了/add路由');
});
(3)使用get/post方式访问 /add 路由
所有方式,app.all()优先级最高。
app.all('/add',(req,res)=>{
res.send('使用get/post方式请求了/add路由');
})
四、中间件
1、中间件定义
中间件就是一堆方法,可以接收客户端发来的请求、可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理。
中间件主要由两部分构成,中间件方法以及请求处理函数。中间件方法由Express提供,负责拦截请求;请求处理函数由开发人员提供,负责处理请求。
app.get('请求路径', '处理函数') // 接收并处理get请求
app.post('请求路径', '处理函数') // 接收并处理post请求
可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间件。
app.get('/request', (req, res, next) => {
req.name = "张三";
next();
});
app.get('/request', (req, res) => {
res.send(req.name);
});
2、app.use中间件用法
app.use 匹配所有的请求方式,可以直接传入请求处理函数,代表接收所有的请求。所有的请求,都会先走use,作用是拦截器。
实际开发中,我们可以通过use中间件方法去判断用户的权限,从而确定该用户能否继续请求相关接口。
app.use((req,res,next)=>{
console.log(req.url);
// next方法,表示继续往下执行
next()
})
app.use 第一个参数也可以传入请求地址,代表不论什么请求方式,只要是这个请求地址就接收这个请求。
app.use('/admin', (req,res,next)=>{
console.log(req.url);
// next方法,表示继续往下执行
next()
})
3、中间件应用
(1)路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登录的页面。
(2)网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。
(3)自定义404页面。
4、错误处理中间件
在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败。
错误处理中间件是一个集中处理错误的地方。
app.use((err, req, res, next) => {
res.status(500).send('服务器发生未知错误');
})
当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件。
app.get("/", (req, res, next) => {
fs.readFile("/file-does-not-exist", (err, data) => {
if (err) {
next(err);
}
});
});
5、捕获错误
在node.js中,异步API的错误信息都是通过回调函数获取的,支持Promise对象的异步API发生错误可以通过catch方法捕获。
异步函数执行如果发生错误,通过 try...catch 可以捕获异步函数以及其他同步代码在执行过程中发生的错误。
app.get("/", async (req, res, next) => {
try {
await User.find({name: '张三'})
}catch(ex) {
next(ex);
}
});
五、跨域
1、定义
同源策略:是浏览器的一种安全策略。
同源:协议名、主机名(域名或ip地址)、端口号必须完全相同。
跨域:就是违背同源策略。
ajax请求,必须要遵循同源策略。
2、解决跨域
(1)JSONP
JSONP是一个非官方的跨域解决方案。JSONP 就是利用script标签的跨域能力来发送请求的,只支持get请求。
例如:img、link、iframe、script。
(2)CORS
CORS跨域资源共享,是官方的跨域解决方案。
跨源资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
设置响应头,允许跨域请求:
response.setHeader('Access-Control-Allow-Origin','*')
允许自定义请求头信息,响应头*表示所有类型的头信息都可以接受:
response.setHeader('Access-Control-Allow-Headers','*')
六、get请求
1、get请求参数的获取
req.query接收前端传递的GET请求参数,框架内部会将GET参数转换为对象并返回。
接收地址栏中问号后面的参数,例如: http://localhost:3000/getStudents?name=zhangsan&age=30
app.get('/getStudents',(req,res)=>{
console.log(req.query); // {"name": "zhangsan", "age": "30"}
})
2、定义get请求接口
req是请求对象,里面保存的是客户端传过来的请求参数。
res是响应对象,用于给客户端响应结果。
res.send()将结果返回给前端。
app.get('/getStudents',(req,res)=>{
console.log(req.query); // 获取GET参数
res.send('hello')
})
七、post请求
1、post请求参数的获取
req.body接收前端传递过来的POST请求参数。
接收POST请求参数,服务器需要进行设置。
(1)通过express.json()中间件,解析表单中的JSON格式数据。
(2)通过express.urlencoded()中间件,解析表单中的url-encoded格式数据。
// 设置允许接收json格式的数据({"name":"张三","age":20})
app.use(express.json())
// 设置允许接收urlencoded格式的数据("name=张三&age=20")
app.use(express.urlencoded({extended:false}))
2、定义post请求接口
app.post('/add', (req, res) => {
console.log(req.body); // 获取POST参数
res.send('hello')
})
八、静态资源的处理
通过Express内置的express.static可以方便地托管静态文件,例如img、CSS、JavaScript 文件等。
设置后,public 目录下面的文件就可以访问了。
app.use(express.static('public'));