前端需知nodejs express中间件使用及定义详解

yizhihongxing

前置知识

在学习本篇攻略之前,需要你对以下内容有一定的了解:

  1. Node.js基础概念
  2. Node.js中间件原理及分类
  3. 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技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue项目使用electron进行打包操作的全过程

    以下是vue项目使用electron进行打包操作的全过程: 步骤一:创建vue项目 首先,我们需要先创建一个vue项目。可以使用vue-cli快速搭建一个工程: npm install -g vue-cli vue init webpack my-vue-project 步骤二:添加 electron 接下来我们需要添加 electron。这里使用的是 el…

    Vue 2023年5月27日
    00
  • VUE视频怎么添加时间地点的水印?

    添加时间地点水印的方法通常有两种,一种是使用CSS样式制作水印,另一种是使用JavaScript插件实现水印。 使用CSS样式制作水印 首先,我们需要在VUE组件的template中添加HTML代码,如下所示: <div class="video-wrapper"> <video src="your_video…

    Vue 2023年5月29日
    00
  • Vue 如何追踪数据变化

    Vue 是一个数据驱动的MVVM框架,其数据变化追踪机制可以让开发者非常方便地进行可靠的开发。Vue 如何追踪数据变化呢?下面是一些关于 Vue 数据变化追踪机制的详细描述。 1. 响应式数据 Vue 中的数据变化追踪是通过”响应式数据”这一概念实现的。所谓”响应式数据”,就是在Vue的实例化过程中,通过对数据进行代理实现当数据发生变化时,及时通知修改监听器…

    Vue 2023年5月28日
    00
  • 用VueJS写一个Chrome浏览器插件的实现方法

    当我们要用VueJS编写Chrome浏览器插件时,需要考虑的主要问题是如何将VueJS代码与Chrome插件API集成。下面是实现步骤的完整攻略: 步骤一:创建一个新的Chrome插件 首先,我们需要在Chrome浏览器中创建一个新的Chrome插件项目,可以使用Chrome浏览器扩展程序模板代码来加速开发。这里以一个新标签页替换Chrome默认新标签页为案…

    Vue 2023年5月27日
    00
  • Vue插槽slot全部使用方法示例解析

    Vue插槽slot全部使用方法示例解析 Vue.js 是一个渐进式的 JavaScript 框架,它采用了组件化的思想。而组件化的另一个关键特性就是插槽(Slot),它可以让我们更加灵活地组织组件、共享代码,并且更好地实现可复用性。 什么是插槽(Slot)? 插槽是一种可以在组件的模板中预留出来的“占位符”,它可以允许我们在使用该组件的时候,把某些内容置入插…

    Vue 2023年5月27日
    00
  • vue2.0 与 bootstrap datetimepicker的结合使用实例

    下面我将详细讲解“vue2.0 与 bootstrap datetimepicker的结合使用实例”的完整攻略。 什么是bootstrap datetimepicker? bootstrap datetimepicker是基于Bootstrap样式的日期和时间选择插件。它可以方便地自定义日期和时间格式,支持语言环境等功能,非常适合用于日期和时间的选择和显示。…

    Vue 2023年5月29日
    00
  • vue-element-admin 登陆及目录权限控制的实现

    下面为你详细讲解“vue-element-admin 登陆及目录权限控制的实现”的完整攻略。 1. 登陆流程 要实现登陆流程,首先需要安装相关依赖包: npm install axios js-cookie 其中,axios 是一个基于 Promise 的 HTTP 库,可用于浏览器和 Node.js,同时也是 Vue 官方推荐的 HTTP 请求库;js-c…

    Vue 2023年5月28日
    00
  • Vue.js每天必学之方法与事件处理器

    Vue.js每天必学之方法与事件处理器 Vue.js是一款流行的JavaScript框架,可以用于构建现代化、高效的Web应用程序。学习Vue.js需要熟悉其核心概念和常用方法,其中事件处理器是重点之一。本文将结合示例详细讲解Vue.js中的方法与事件处理器。 Vue.js中的方法 Vue.js提供了许多内置方法,用于处理组件的生命周期、渲染、数据传递等。以…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部