首页 > 其他分享 >使用中间件

使用中间件

时间:2023-09-05 18:45:38浏览次数:29  
标签:res req 中间件 next user 使用 id

使用中间件

Express 是一个路由和中间件 Web 框架,它自己的功能很少:Express 应用程序本质上是一系列中间件函数调用。

中间件函数是有权访问请求对象 ()、响应对象 () 和应用程序请求-响应周期中的下一个中间件函数的函数。下一个中间件函数通常由名为 的变量表示。reqresnext

中间件函数可以执行以下任务:

  • 执行任何代码。
  • 对请求和响应对象进行更改。
  • 结束请求-响应周期。
  • 调用堆栈中的下一个中间件函数。

如果当前中间件函数没有结束请求-响应周期,则必须调用以将控制权传递给下一个中间件函数。否则,请求将保持挂起状态。next()

快速应用程序可以使用以下类型的中间件:

您可以使用可选的挂载路径加载应用程序级和路由器级中间件。 您还可以一起加载一系列中间件函数,从而在挂载点创建中间件系统的子堆栈。

应用级中间件

使用 and 函数将应用程序级中间件绑定到应用程序对象的实例,其中中间件函数以小写形式处理的请求(例如 GET、PUT 或 POST)的 HTTP 方法。app.use()app.METHOD()METHOD

此示例显示了一个没有挂载路径的中间件函数。每次应用收到请求时都会执行该函数。

var express = require('express')
var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

此示例显示了挂载在路径上的中间件函数。该函数适用于任何类型的 路径上的 HTTP 请求。/user/:id/user/:id

app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
})

此示例显示路由及其处理程序函数(中间件系统)。该函数处理对路径的 GET 请求。/user/:id

app.get('/user/:id', function (req, res, next) {
  res.send('USER')
})

下面是使用挂载路径在挂载点加载一系列中间件函数的示例。 它演示了一个中间件子堆栈,该子堆栈将任何类型的 HTTP 请求的请求信息打印到路径。/user/:id

app.use('/user/:id', function (req, res, next) {
  console.log('Request URL:', req.originalUrl)
  next()
}, function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
})

路由处理程序使您能够为路径定义多个路由。下面的示例为 GET 请求定义了两个路由到路径。第二个路由不会导致任何问题,但永远不会被调用,因为第一个路由结束了请求-响应周期。/user/:id

此示例显示了一个中间件子堆栈,用于处理对路径的 GET 请求。/user/:id

app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id)
  next()
}, function (req, res, next) {
  res.send('User Info')
})

// handler for the /user/:id path, which prints the user ID
app.get('/user/:id', function (req, res, next) {
  res.send(req.params.id)
})

要跳过路由器中间件堆栈中的其余中间件功能,请调用以将控制权传递给下一个路由。注意:仅适用于使用 or 函数加载的中间件函数。next('route')next('route')app.METHOD()router.METHOD()

此示例显示了一个中间件子堆栈,用于处理对路径的 GET 请求。/user/:id

app.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next route
  if (req.params.id === '0') next('route')
  // otherwise pass the control to the next middleware function in this stack
  else next()
}, function (req, res, next) {
  // send a regular response
  res.send('regular')
})

// handler for the /user/:id path, which sends a special response
app.get('/user/:id', function (req, res, next) {
  res.send('special')
})

中间件也可以在数组中声明以实现可重用性。

此示例显示了一个具有中间件子堆栈的数组,该子堆栈处理对路径的 GET 请求/user/:id

function logOriginalUrl (req, res, next) {
  console.log('Request URL:', req.originalUrl)
  next()
}

function logMethod (req, res, next) {
  console.log('Request Type:', req.method)
  next()
}

var logStuff = [logOriginalUrl, logMethod]
app.get('/user/:id', logStuff, function (req, res, next) {
  res.send('User Info')
})

路由器级中间件

路由器级中间件的工作方式与应用程序级中间件相同,只是它绑定到 的实例。express.Router()

var router = express.Router()

使用 and 函数加载路由器级中间件。router.use()router.METHOD()

以下示例代码使用路由器级中间件复制上面显示的应用程序级中间件的中间件系统:

var express = require('express')
var app = express()
var router = express.Router()

// a middleware function with no mount path. This code is executed for every request to the router
router.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
router.use('/user/:id', function (req, res, next) {
  console.log('Request URL:', req.originalUrl)
  next()
}, function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
})

// a middleware sub-stack that handles GET requests to the /user/:id path
router.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next router
  if (req.params.id === '0') next('route')
  // otherwise pass control to the next middleware function in this stack
  else next()
}, function (req, res, next) {
  // render a regular page
  res.render('regular')
})

// handler for the /user/:id path, which renders a special page
router.get('/user/:id', function (req, res, next) {
  console.log(req.params.id)
  res.render('special')
})

// mount the router on the app
app.use('/', router)

要跳过路由器的其余中间件功能,请调用以将控制权传回路由器实例。next('router')

此示例显示了一个中间件子堆栈,用于处理对路径的 GET 请求。/user/:id

var express = require('express')
var app = express()
var router = express.Router()

// predicate the router with a check and bail out when needed
router.use(function (req, res, next) {
  if (!req.headers['x-auth']) return next('router')
  next()
})

router.get('/user/:id', function (req, res) {
  res.send('hello, user!')
})

// use the router and 401 anything falling through
app.use('/admin', router, function (req, res) {
  res.sendStatus(401)
})

错误处理中间件

错误处理中间件始终采用四个参数。您必须提供四个参数才能将其标识为错误处理中间件函数。即使不需要使用该对象,也必须指定它以维护签名。否则,该对象将被解释为常规中间件,并且无法处理错误。nextnext

定义错误处理中间件函数的方式与其他中间件函数相同,除了使用四个参数而不是三个参数,特别是使用签名):(err, req, res, next)

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

有关错误处理中间件的详细信息,请参阅:错误处理

内置中间件

从版本 4.x 开始,Express 不再依赖于 Connect。中间件 以前包含在 Express 中的功能现在位于单独的模块中;请参阅中间件函数列表

Express 具有以下内置中间件功能:

  • express.static 提供静态资产,如 HTML 文件、图像等。
  • express.json 使用 JSON 有效负载解析传入请求。注意:适用于快速版 4.16.0+
  • express.urlencoded 使用 URL 编码的有效负载解析传入请求。注意:适用于快速版 4.16.0+

第三方中间件

使用第三方中间件向 Express 应用程序添加功能。

安装 Node.js 模块以实现所需的功能,然后在应用程序级别或路由器级别将其加载到应用中。

以下示例说明了安装和加载 cookie 解析中间件函数。cookie-parser

$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')

// load the cookie-parsing middleware
app.use(cookieParser())

有关通常与 Express 一起使用的第三方中间件函数的部分列表,请参阅:第三方中间件

标签:res,req,中间件,next,user,使用,id
From: https://www.cnblogs.com/full-stack-linux-new/p/17680517.html

相关文章

  • 使用 Docker Compose 部署 Redis Sentinel 高可用架构
    在现代应用中,无法容忍系统中断或数据丢失。Redis作为一种高性能的内存数据库,被广泛应用于缓存、会话管理等场景。然而,即使我们拥有可伸缩的RedisCluster集群,也需要考虑在主节点故障时自动切换到从节点的机制。这时候RedisSentinel就派上用场了。高可用性是分布式应用的核心......
  • Node.js 使用 officecrypto-tool 读取加密的 Excel (xls, xlsx) 和 Word( docx)文档
    Node.js使用officecrypto-tool读取加密的Excel(xls,xlsx)和Word(docx)文档,还支持xlsx和docx文件的加密(具体使用看文档)。暂时不支持doc文件的解密传送门:officecrypto-tool读取加密的Excel示例一:xlsx-populate//只支持xlsx,xlsx-populate自带了解密功能,/......
  • 【C++STL基础入门】队列的基础使用
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档@TOC前言C++标准模板库(STL)提供了一系列强大的容器和算法,方便我们在编程中处理数据和实现各种功能。其中,queue(队列)是STL中的一个重要容器,用于按照先进先出(FIFO)的顺序处理元素。本文将介绍queue的基础使用方法,帮助读者初......
  • 使用 SQLStudio 进行数据库管理并通过 Docker Compose 进行部署
    在现代软件开发中,数据库管理是一个至关重要的环节。SQLStudio是一个强大的工具,可以帮助开发人员轻松管理数据库,现在改名成SQLynx,我们用的是旧的镜像,本文还是用SQLStudio这个名称。同时,使用DockerCompose可以简化应用程序的部署过程,使整个开发流程更加高效和可靠。最近了看到有......
  • [编程基础] Python内置模块collections使用笔记
    collections是Python标准库中的一个内置模块,它提供了一些额外的数据结构类型,用于增强Python基础类型如列表(list)、元组(tuple)和字典(dict)等。以下是对collections模块中主要数据结构类的概述:namedtuple:命名元组,创建一个带有名称的tuple,并且可以通过名称访问元素。deque:双端队列,可......
  • 运用手机运营商二要素Api接口,守护您的账户和隐私,让您安心使用!
    随着移动互联网的普及,我们的生活离不开手机,手机成为了我们生活中不可或缺的一部分。但是随着移动支付的普及,手机支付在我们的生活中也变得越来越重要。手机支付是一种方便快捷的支付方式,但是也存在一些安全隐患。如果我们在使用手机支付时不小心泄露了我们的账户和隐私,那么后果不......
  • python pip安装源使用(记录需要放置的文件位置)
     win系统下:资源管理器地址栏(或任意文件夹地址栏)中输入%appdata%回车进入该目录。 在此文件夹下新建pip文件夹,然后在文件夹中添加pip.ini文件  文件写入:[global]trusted-host=nexus.XXXXXXX.cnindex-url=http://nexus.XXXXXXX.cn/repositor......
  • 使用工作流快速开发平台,做好企业数据资源管理!
    面对越来越繁忙的业务,很多客户朋友不知道用什么样的平台才能快速处理好企业内部数据,做出更有利于企业发展的经营决策。其实,低代码技术平台、工作流快速开发平台是可以让企业减少重复工作,提高工作效率,实现流程化办公管理的重要工具。流辰信息将坚持最初的研发梦想,提高自主研发能力,......
  • 控件使用
    ComboBoxItemsSource:获取或设置用于生成ItemsControl的内容的集合,继承自ItemsControl。用于指定下拉列表绑定的集合类数据对象。SelectedIndex:获取或设置当前选择中项的索引,如果选择为空,则返回负1,继承自Selector。下拉列表中选中行的索引。DisplayMemberPath:获取或设置源对象......
  • Android surfaceview的使用方式
    1.什么是surfaceviewsurfaceview内部机制和外部层次结构在安卓开发中,我们经常会遇到一些需要高性能、高帧率、高画质的应用场景,例如视频播放、游戏开发、相机预览等。这些场景中,我们需要直接操作图像数据,并且实时地显示到屏幕上。如果我们使用普通的view组件来实现这些功能,可能会......