前置知识
在学习本篇攻略之前,需要你对以下内容有一定的了解:
- Node.js基础概念
- Node.js中间件原理及分类
- Express基础概念和使用
什么是中间件
在Express中,一个请求从进入应用到返回响应的整个过程中,可以被看做是一系列的中间件函数依次执行的过程。其中的每一个中间件函数完全可以通过req
,res
, next
这三个参数实现功能,同时以一个函数为最小单位组合形成一个完整的应用。
中间件的作用
中间件函数通常被用于处理请求和响应,可以对请求做预处理,比如检查请求的参数是否合法,更改请求的头信息、cookie和session等;也可以对响应结果做后处理,对结果进行加工或格式化等。
如何使用和定义中间件
使用中间件
在Express中,使用中间件函数的方式非常简单,只需要将中间件函数作为参数传递给相应的请求方法即可,比如使用中间件函数函数来处理所有的get请求:
app.use(function(req, res, next) {
console.log('Time:', Date.now());
next();
})
上述代码中,通过app.use()
定义了一个中间件函数,每当有一个请求进入时,都会先被该函数处理,其中,next
参数用于将请求传递给下一个中间件函数,如果没有下一个中间件函数,则请求将被处理完成。
定义中间件
我们也可以自定义中间件函数,通常通过app.use()
或app.method()
来定义,以对某种请求方式的url进行一个或多个中间件的处理,如下:
app.use('/user/:id', function(req, res, next) {
console.log('User:', req.params.id);
next();
})
app.get('/user/:id', function(req, res, next) {
res.send('User: ' + req.params.id);
})
上述代码中,使用了一个自定义中间件函数和一个get请求处理函数来处理/user/:id
对应的url,其中自定义中间件的作用是在请求进入应用后,先输出User:id
,然后将请求传至下一个中间件或处理函数。
示例1: JWT Token实现身份认证
下面,我们以JWT Token实现身份认证为例,来说明一个中间件函数的完整实现过程。
Step1: 获取JWT Token
首先我们需要安装jsonwebtoken
模块,用于生成和签名JWT Token。 若已经安装,可直接跳过此步骤。
npm install jsonwebtoken --save
安装完成后,我们可以在脚本文件中引入该模块,并生成一个jwt token:
// 引入jsonwebtoken模块
const jwt = require('jsonwebtoken');
// 生成jwt token
const token = jwt.sign({username: 'abc'}, 'secretKey');
Step2: 中间件定义和使用
// 引入jsonwebtoken模块
const jwt = require('jsonwebtoken');
// 中间件函数定义
const auth = function(req, res, next) {
try {
// 获取客户端提交的token
const token = req.headers.authorization.split(' ')[1];
// 使用jsonwebtoken模块进行验证
const decoded = jwt.verify(token, 'secretKey');
req.userData = decoded; //将取出的数据存到req.userData中
next();
} catch (error) {
return res.status(401).json({
message: '认证失败'
});
}
};
// 需要使用该中间件的路由
app.get('/user-info', auth, (req, res) => {
res.send(req.userData);
});
上述代码中,我们定义了一个中间件函数auth
,它用于获取客户端提交的JWT Token并验证其有效性,若验证成功,则将存入Token的用户信息存放到请求对象req
的属性userData
中。接下来,我们定义一个需要经过身份验证的路由/user-info
,使用auth
定义的中间件函数来实现对该请求的认证,若通过身份验证,则返回req.userData中存储的用户信息。
Step3: 客户端请求
最后,我们可以使用curl
命令模拟一个客户端发送请求:
$ curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" http://localhost:3000/user-info
在请求头中携带我们生成的token,用于验证身份,若中间件验证成功,则返回存储在req.userData
中的用户信息。
示例2: 用户角色权限控制
下面,我们以控制用户角色权限为例,来说明多个中间件函数组成的中间件函数体系的实现过程。
Step1: 中间件定制
首先我们需要定义若干个中间件用于验证用户角色权限:
async function hasRole(req, res, next) {
const role = req.user.role;
if (role !== 'admin') {
return res.status(403).json({error: 'forbidden'})
}
next();
};
async function canEditPost(req, res, next) {
const id = req.params.post_id;
const post = await getPost(id);
const author = post.author;
if (req.user.id !== author) {
return res.status(403).json({error: 'forbidden'})
}
req.post = post;
next();
};
async function deletePost(req, res, next) {
const id = req.post.id;
await deletePost(id);
res.send('Delete Post!')
};
在上面代码中,hasRole()
函数用于判断请求发出者是否为管理员角色,若不是,则返回403 Forbidden状态码;canEditPost()
函数用于判断该用户是否有编辑该文章的权限;deletePost()
函数则是一个最终处理函数,进行完所有的中间件函数后,最终将请求的结果返回给客户端。
Step2: 中间件组合
app.delete(
'/posts/:post_id',
authenticate,
hasRole,
canEditPost,
deletePost
);
在上述代码中,我们组合了若干个中间件函数,用于实现对删除文章请求的角色权限控制。其中,authenticate
是一个用于检验用户身份的中间件函数,用于作为该请求中第一步的认证函数,下一步则是hasRole()
函数,若用户角色为管理员,则进入下一步canEditPost()
函数,该函数用于根据文章是否为用户自己创建的来判断用户是否有编辑文章的权限,最后进入deletePost()
函数或返回403 Forbidden状态码。
至此,我们已经完成了多个中间件函数组成的中间件函数体系的示例实现,其中每个被中间件函数处理的请求在整个过程中都依次经过了每个中间件函数的处理。
总结:本篇攻略详细讲解了前端开发中Node.js
Express
中间件的使用和定义,并通过两个示例讲解了JWT Token和用户角色权限控制在中间件的实际应用,希望能对你学习中间件函数的理解和实践有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:前端需知nodejs express中间件使用及定义详解 - Python技术站