Node.js Express 框架1:路由,响应,中间件
文章目录
前言:
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。
在学习本此内容,请先学习Node.js基础知识。
一,路由
1.路由的介绍:
路由 指确定应用程序如何响应客户端对特定终结点的请求,它是一个 URI(应用程序的端点)或路径,一个特定的 HTTP 请求方法(GET
、POST
、PUT
、DELETE
等),可以有一个或多个处理函数组成。
广义上来讲,路由就是映射关系。在Express中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
路由的匹配过程:
- 每当一个请求到达服务器后,需要先经过路由的 匹配,只有匹配成功后,才会调用对应的处理函数。
- 在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转交给对应的 function 函数进行处理。
2.路由的使用:
路由定义采用以下结构:
app.METHOD(PATH, HENDLER)
其中:
app
是express
的一个实例。METHOD
是小写的 HTTP 请求方法。PATH
是服务器上的路径。HANDLER
是匹配路由时执行的函数。
使用实例:
// 引入 express 框架
const express = require("express");
// 创建网站服务器
const app = express();
// 拦截路由
// 首页响应hello:
app.get('/', (req, res) => {
res.send('hello!')
})
//响应根路由(/)上的 POST 请求,应用的主页:
app.post('/', (req, res) => {
res.send('Got a POST request')
})
//监听端口:
app.listen(3000, ()=>{
console.log('端口3000已经打开')
})
模块化路由
为了方便对路由进行模块化管理,Express不建议将路由直接挂载到app上,而是推荐将路由抽离为单独的模块。
步骤如下:
- 创建路由模块对应的 .js 文件
- 调用 express.Router() 函数创建路由对象
- 向路由对象上挂载具体的路由
- 使用 module.exports 向外共享路由对象
- 使用 app.use() 函数注册路由模块
// 路由模块 router.js
const express = require('express');
const router = express.Router();
// 挂在具体的路由:
router.get('/home', (req, res) => {
res.send('首页');
})
// 向外导出路由对象:
module.exports = router;
二,响应
res
对象表示 Express 应用程序在收到 HTTP 请求时发送的 HTTP 响应。
1.一般响应:
在使用 Node.js
的服务端代码中,如果使用的是 Express 框架,那么对于一个请求,常常会有两种响应方式:
// 方法1
app.get("/end", (req, res, next) =>{
res.end(xxx);
});
// 方法2
app.get("/send", (req, res, next) =>{
res.send(xxx);
});
两者对比:
Express 的 res.end ()
和res.send ()
方法的相同点:
- 二者最终都是回归到
http.ServerResponse.Use
的response.end()
方法。 - 二者都会结束当前响应流程。
Express 的 res.end ()
和 res.send ()
方法的不同点:
前者只能发送 string
或者 Buffer
类型,后者可以发送任何类型数据。
从语义来看,前者更适合没有任何响应数据的场景,而后者更适合于存在响应数据的场景。
总结
Express 的 res.end ()
和 res.send ()
方法使用上,一般建议使用res.send()
方法即可,这样就不需要关心响应数据的格式,因为 Express 内部对数据进行了处理。
2.其他响应:
三,中间件
1.中间件的介绍:
中间件函数是在应用的请求-响应周期中可以访问 请求对象 (req
)、响应对象 (res
) 和 next
函数的函数。next
函数是 Express 路由中的一个函数,当被调用时,它会在当前中间件之后执行中间件。
中间件(Middleware)本质是一个回调函数。中间件函数
可以像路由回调一样访问 请求对象(request)
, 响应对象(respoense)
。
中间件的作用就是使用函数封装公共操作,简化代码。
中间件的类型:全局中间件,路由中间件。
中间件功能可以执行以下任务:
- 执行任何代码。
- 更改请求和响应对象。
- 结束请求 - 响应周期。
- 调用堆栈中的下一个中间件函数。
2.全局中间件实践:
// 记录每个请求的url 与 IP 地址
//导入 express
const express = require('express');
const fs = require('fs');
const path = require('path');
//创建应用对象
const app = express();
//声明中间件函数
function recordMiddlware(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(recordMiddlware);
//创建路由
app.get('/home', (req, res) => {
res.send('前台首页');
});
app.all('*', (req, res)=>{
res.send('<h1>404 not found</h1>')
})
//监听端口
app.listen(3000, ()=>{
console.log('服务已经启动,端口3000正在监听..')
})
3.路由中间件实践:
/** 要求:::针对 /admin 的请求,
要求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.listen(3000, ()=>{
console.log('服务已经启动,端口3000正在监听..')
})
4.静态资源中间件:
补充,静态资源是什么:使用静态网页技术开发的资源(Html,CSS,JavaScript)。
特点:所有用户访问,得到的结果是一样的。如:文本,图片,音频,视频,Html,CSS,JavaScript都属于静态资源。 如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器。浏览器种内置了静态资源的解析引擎,可以展示静态资源。
// 导入 express
const express = require('express');
// 创建应用对象
const app = express();
// 静态资源中间件设置
app.use(express.static(__dirname + '/public'));
// 创建路由
app.get('/home', (req, res)=>{
res.send('前台首页');
});
//监听端口
app.listen(3000, ()=>{
console.log('服务已经启动,端口3000正在监听..')
})
注意事项:
1.index.html 文件为默认打开的资源。
2.如果静态资源与路由规则同时匹配,谁先匹配就谁响应。
3.路由响应动态资源,静态资源中间件响应静态资源。
Thanks!!