深入理解nodejs中Express的中间件

深入理解nodejs中Express的中间件是一个非常重要的主题,在开始详细讲解前,我们先来了解一下Express的中间件的概念。

什么是Express中间件?

Express中间件是一种可以访问请求对象(req)、响应对象(res)和应用程序的中间件函数。在Express应用程序中,中间件就像是可以在请求到达路由处理程序之前执行的“过滤器”,它们可以用于执行各种任务,例如:记录请求、处理POST请求、处理错误等等。Express中间件的形式可以是函数、对象、数组甚至是字符串。

如何使用Express中间件?

Express中间件使用app.use()函数调用。app.use()函数接受一个或多个参数,每个参数都是中间件函数。下面是一个简单的例子,演示如何使用Express中间件:

app.use((req, res, next) => {
  console.log('Incoming request from ' + req.ip);
  next();
});

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

在上面的例子中,app.use()函数接受一个匿名函数作为参数,该函数记录了所有传入请求的IP地址,并使用next()函数在记录IP地址后继续请求。

Express中间件的类型

为了更好地理解Express中间件,我们来看一下它的三种类型:

应用程序级别中间件:

应用程序级别中间件是在整个Express应用程序上定义的中间件,它们使用app.use()函数构建。应用程序级别中间件对每个请求都会被调用。这种类型的中间件通常用于处理请求之前、请求中间和请求之后的任务,例如:设置请求头、处理错误、设置Cookie等等。

下面是一个应用程序级别中间件的示例:

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

app.use((req, res, next) => {
  console.log('Incoming request from ' + req.ip);
  next();
});

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

在上面的示例中,使用app.use()函数定义了一个应用程序级别中间件,并在其中记录了所有传入请求的IP地址。

路由级别中间件:

路由级别中间件只能应用于特定的路由上。路由级别中间件是使用router.use()函数或router.METHOD()函数创建的,该函数包括HTTP请求方法名称,例如:router.get()、router.put()等等。该函数将路由中间件附加到特定的路由路径上。

下面是一个路由级别中间件的示例:

const express = require('express');
const app = express();
const router = express.Router();

// Define a router-level middleware
router.use((req, res, next) => {
  console.log('Incoming request from ' + req.ip);
  next();
});

// Define a route and associated route-level middleware
router.get('/', (req, res) => {
  res.send('Hello, world!');
});

// Attach the router to the app
app.use('/', router);

在上面的示例中,使用router.use()函数定义了一个路由级别中间件。该中间件仅适用于与该路由相关的任何请求。

错误处理中间件:

错误处理中间件用于处理Express应用程序中出现的所有错误。在错误处理中间件中,我们可以调用发生错误时执行的任何适当行动。错误处理中间件的形式是一个函数,该函数包含四个参数:err、req、res和next。当定义一个错误处理中间件函数时,必须将其作为最后一个定义的中间件函数。

下面是一个错误处理中间件的示例:

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

app.get('/', (req, res, next) => {
  try {
    const x = JSON.parse(req.query.x);
    res.send(x);
  } catch (err) {
    next(err);
  }
});

// Error handling middleware
app.use((err, req, res, next) => {
  console.log(err.stack);
  res.status(500).send('Server error!');
});

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

在上面的示例中,我们使用了try-catch语句来尝试将查询参数解析为JSON格式。如果发生错误,则调用next()函数将错误传递给错误处理中间件。在错误处理中间件函数中,我们记录了错误,然后向客户端返回一个500状态代码和一个错误消息。

示例说明

我们来看一个更复杂的示例,假设我们有这样一个Express路由程序:

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

function logger(req, res, next) {
  console.log(req.method, req.url);
  next();
}

app.use(logger);

app.get('/', (req, res, next) => {
  res.send('Home Page');
});

app.get('/about', (req, res, next) => {
  res.send('About Page');
});

app.use((req, res, next) => {
  res.status(404).send('404 Page Not Found');
});

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

在上面的示例中,我们定义了一个logger中间件函数,用于记录每个请求的HTTP方法和URL。我们在应用程序中使用app.use()将该中间件附加到整个应用程序中,并在日志文件中记录每个传入请求。

我们还定义了两个路由:'/'对应主页,'/about'对应关于页面。我们在其中定义了发送响应的响应函数,它们将一个字符串作为响应发送回客户端。

在应用程序的结尾处,我们还定义了一个404中间件函数。它在找不到处理请求的路由时调用。它返回一个404状态代码以及一个标准的404页面,告诉客户端请求的页面不存在。

我们还可以使用中间件在请求和响应之间进行必要的处理。例如,我们可以在服务器上启用gzip压缩来减少传输量:

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

function compress(req, res, next) {
  const stream = zlib.createGzip();
  stream.writeHead(200, {
    'Content-Encoding': 'gzip',
    'Content-Type': 'text/plain'
  });
  stream.pipe(res);
  next();
}

app.use(compress);

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

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

在上面的示例中,我们定义了一个名为compress的中间件函数,该函数使用zlib节点模块对响应进行gzip压缩。在处理完请求后,它通过next()函数将其传递给下一个中间件或路由。最后,它将压缩后的响应发送回客户端。

在上面的两个示例中,我们演示了如何定义和使用Express中间件。无论是应用程序级别中间件、路由级别中间件还是错误处理中间件,它们都是我们在编写Express应用程序时必不可少的强大工具。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解nodejs中Express的中间件 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • django将数组传递给前台模板的方法

    将数组传递给Django前端模板有两种方法: 方法一:使用context传递数组 在views.py文件中定义数组,然后在render函数中使用context将数组传递给前端模板。示例如下: from django.shortcuts import render def my_view(request): my_array = [1, 2, 3, 4, 5]…

    node js 2023年6月8日
    00
  • nodejs管理工具nvm安装过程详解

    Nodejs管理工具nvm安装过程详解 什么是nvm nvm (node version manager) 是一个用于管理多个Nodejs版本的工具。它可以让你在同一台机器上轻松地切换不同版本的Nodejs,从而在不同的项目中使用不同的Nodejs版本。 安装nvm 步骤一:获取nvm安装脚本 你可以在github上的nvm仓库获取nvm的安装脚本。使用cu…

    node js 2023年6月8日
    00
  • 如何写出一个惊艳面试官的JavaScript深拷贝

    以下是如何写出一个惊艳面试官的JavaScript深拷贝的完整攻略。 1. 了解深拷贝的概念 深拷贝是一个常见的编程概念,指的是将一个对象完整复制到一个新的内存空间中。与浅拷贝不同,深拷贝不仅可以复制对象本身,还可以递归地复制对象中的嵌套对象。在JavaScript中,深拷贝是十分常见的操作,也是JavaScript语言的难点之一。 2. 选择合适的方法进行…

    node js 2023年6月8日
    00
  • NodeJS实现图片上传代码(Express)

    针对NodeJS实现图片上传代码(Express),我为你准备了完整的攻略,包括以下内容: 一、安装依赖 在开始之前,需要先确保你已经安装了NodeJS和NPM,如果没有,请先自行进行安装。然后在你的项目目录下执行以下命令安装必要的依赖: npm install express multer path –save 其中,multer是一个Node.js中间…

    node js 2023年6月8日
    00
  • Node.js实现分片上传断点续传示例详解

    首先,为了实现分片上传断点续传,我们需要使用Node.js提供的相关模块和技术。具体来说,我们需要用到http模块和fs模块。 步骤如下: 1.创建一个基于http模块的服务器,用于接收上传的文件,并为每一个上传的文件创建一个唯一的标识(例如文件名、UUID等),并将这些标识保存到一个数组中,以便用于断点续传。 示例代码: const http = requ…

    node js 2023年6月8日
    00
  • node.js中的path.join方法使用说明

    Node.js中的path.join方法是一个非常常用的方法,它可以将多个路径拼接成一个完整的路径,并返回一个规范化后的路径。 方法说明 path.join方法属于Node.js的path模块中的一个方法,由于不需要创建path对象,也不需要指定this,因此可以直接使用该方法。 方法定义如下: path.join([…paths]) 其中,参数为多个需…

    node js 2023年6月8日
    00
  • NodeJs实现简单的爬虫功能案例分析

    Node.js是现在最为流行的后端JavaScript语言之一,也是一种基于事件驱动、非阻塞式I/O模型,轻量且高效的服务端开发框架。利用Node.js可以很方便地实现网络爬虫,下面我们来详细讲解怎样使用Node.js实现简单的爬虫功能。 1. 安装Node.js 在使用Node.js实现网络爬虫之前,我们需要安装Node.js环境。在Node.js的官网上…

    node js 2023年6月8日
    00
  • nodejs与浏览器中全局对象区别点总结

    让我们来详细讲解一下“nodejs与浏览器中全局对象区别点总结”的完整攻略。 内容 本攻略主要讲解nodejs与浏览器中全局对象的区别。我们知道,在浏览器中,全局对象是window,而在nodejs中,全局对象是global。下面是两者的区别: 1. this 在浏览器中全局作用域下,this指向window,我们可以使用: console.log(this…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部