Express中全局中间件与局部中间件的使用

 更新时间:2024年12月11日 10:54:12   作者:Peter-Lu  
本文介绍了Express框架中的全局中间件与局部中间件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Express 是 Node.js 生态系统中最流行的 Web 应用框架之一,提供了简洁的 API,便于开发者创建 Web 应用程序和 RESTful API。本文将详细介绍 Express 中的全局中间件与局部中间件,帮助开发者更好地理解两者的区别、用法以及在实际项目中的应用场景。

一、Express 中的中间件概述

1. 什么是中间件?

中间件(middleware)是 Express 应用程序中处理请求的函数,通常用于处理 HTTP 请求和响应的过程。中间件可以访问请求对象(req)、响应对象(res)以及应用程序的下一个中间件函数。其主要作用是处理请求数据、进行身份验证、记录日志、处理错误等。

中间件可以通过以下三种方式应用:

  • 全局中间件:在应用程序中全局生效,所有请求都会经过该中间件。
  • 局部中间件:只作用于特定的路由或请求。
  • 错误处理中间件:专门用于捕获和处理错误。

2. Express 中的中间件执行顺序

在 Express 中,中间件是按照定义的顺序依次执行的。当一个中间件处理完毕后,可以通过调用 next() 函数将控制权传递给下一个中间件。如果不调用 next(),则请求将会挂起,后续的中间件或路由不会被执行。

二、全局中间件的作用与用法

1. 什么是全局中间件?

全局中间件是指在应用程序启动时注册的中间件,这些中间件对所有路由和请求生效。通常用于一些通用的处理逻辑,比如解析请求体、处理静态文件、添加全局响应头等。

2. 常见的全局中间件示例

以下是一些常用的全局中间件示例:

(1) 解析 JSON 请求体的中间件

Express 内置了 express.json() 中间件,用于解析请求体中的 JSON 数据:

const express = require('express');
const app = express();

// 全局解析 JSON 请求体
app.use(express.json());

app.post('/data', (req, res) => {
  res.send(req.body);  // 输出解析后的 JSON 数据
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

(2) 日志记录中间件

开发者可以使用第三方中间件如 morgan 来记录 HTTP 请求日志:

const express = require('express');
const morgan = require('morgan');
const app = express();

// 全局日志记录中间件
app.use(morgan('combined'));

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

(3) 静态文件处理中间件

使用 express.static() 处理静态文件请求:

const express = require('express');
const app = express();

// 全局处理静态文件
app.use(express.static('public'));

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,public 目录下的文件可以通过 / 直接访问,例如 public/index.html 可以通过 http://localhost:3000/index.html 访问。

3. 全局中间件的使用场景

全局中间件通常用于以下场景:

  • 请求解析:如解析 JSON、URL 编码的数据等。
  • 身份验证:对所有路由进行身份验证或权限校验。
  • 请求日志:记录所有请求的详细信息。
  • 错误处理:全局捕获应用程序中的错误。

三、局部中间件的作用与用法

1. 什么是局部中间件?

局部中间件是指仅在特定路由或一组路由中生效的中间件。这种中间件只会在匹配到特定路由时执行,适用于那些只针对部分路由进行的处理逻辑。

2. 局部中间件的定义与使用

局部中间件的定义通常是在路由处理函数之前,作为参数传递给路由。以下是一个简单的示例:

const express = require('express');
const app = express();

// 局部中间件函数
const checkAuth = (req, res, next) => {
  const auth = req.headers.authorization;
  if (auth === 'secret-token') {
    next();  // 如果验证通过,继续处理下一个中间件或路由
  } else {
    res.status(403).send('Forbidden');  // 否则返回 403
  }
};

// 在特定路由中使用局部中间件
app.get('/protected', checkAuth, (req, res) => {
  res.send('This is a protected route');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,checkAuth 中间件只对 /protected 路由生效,用于验证请求头中的 authorization 是否匹配。

3. 多个局部中间件的使用

Express 支持在单个路由中使用多个局部中间件。可以通过链式调用来实现这一点:

const express = require('express');
const app = express();

const middleware1 = (req, res, next) => {
  console.log('Middleware 1');
  next();
};

const middleware2 = (req, res, next) => {
  console.log('Middleware 2');
  next();
};

app.get('/example', middleware1, middleware2, (req, res) => {
  res.send('Hello from /example route');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在 /example 路由中,middleware1 和 middleware2 都会按顺序执行,然后再由路由处理函数发送响应。

4. 局部中间件的使用场景

局部中间件通常用于以下场景:

  • 特定路由的权限验证:如用户权限验证或 API Key 验证。
  • 特定请求的预处理:如为某些路由添加自定义的请求头或参数。
  • 路由日志记录:只记录某些敏感路由的请求日志。

四、全局中间件与局部中间件的区别

全局中间件与局部中间件的主要区别在于它们的作用范围:

特性全局中间件局部中间件
作用范围对所有请求生效只对特定路由或请求生效
典型用途解析请求体、处理静态文件、身份验证等权限验证、参数处理、日志记录等
执行顺序按照在应用程序中注册的顺序执行按照在路由中定义的顺序执行
应用场景通用功能,如请求解析、错误处理等特定场景,如单一路由的权限验证等

五、总结

在 Express 应用程序中,全局中间件与局部中间件各有用途。全局中间件用于处理那些适用于整个应用程序的通用逻辑,如请求体解析、日志记录等。而局部中间件则可以在特定路由中应用,提供更精细化的控制,如路由权限验证或请求预处理。

到此这篇关于Express中全局中间件与局部中间件的使用的文章就介绍到这了,更多相关Express 全局中间件与局部中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • node+axios实现服务端文件上传示例

    node+axios实现服务端文件上传示例

    这篇文章主要介绍了node+axios实现服务端文件上传示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Node.js的MongoDB驱动Mongoose基本使用教程

    Node.js的MongoDB驱动Mongoose基本使用教程

    这篇文章主要介绍了Node.js的MongoDB驱动Mongoose的基本使用教程,前端js+后端Node.js+数据库MongoDB是当下流行的JavaScript全栈开发方案,需要的朋友可以参考下
    2016-03-03
  • 浅谈nodejs中创建cluster

    浅谈nodejs中创建cluster

    集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。本文将详细介绍如何在nodejs中创建cluster。
    2021-06-06
  • node以及npm版本不对应出错的完美解决方法

    node以及npm版本不对应出错的完美解决方法

    最近项目用到了node和npm,查看一下当前版本,发现有报错,下面这篇文章主要给大家介绍了关于node以及npm版本不对应出错的完美解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • node.js require() 源码解读

    node.js require() 源码解读

    学习 Node.js ,必学如何使用 require 语句。本文通过源码分析,详细介绍 require 语句的内部运行机制,帮你理解 Node.js 的模块机制
    2015-12-12
  • windows下更新npm和node的方法

    windows下更新npm和node的方法

    本篇文章主要介绍了windows下更新npm和node的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 基于node.js的fs核心模块读写文件操作(实例讲解)

    基于node.js的fs核心模块读写文件操作(实例讲解)

    下面小编就为大家带来一篇基于node.js的fs核心模块读写文件操作(实例讲解)。小编觉得挺不错的,现在就想给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Node.js实现注册邮箱激活功能的方法示例

    Node.js实现注册邮箱激活功能的方法示例

    现在很多网站都需要有注册邮箱激活的功能,本篇文章主要介绍了Node.js实现注册邮箱激活功能的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • node.js中的fs.open方法使用说明

    node.js中的fs.open方法使用说明

    这篇文章主要介绍了node.js中的fs.open方法使用说明,本文介绍了fs.open方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • nodejs实现jwt的示例代码

    nodejs实现jwt的示例代码

    本文主要介绍了nodejs实现jwt的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论