我正在开发NodeJS并使用"Express js",现在我正在开发"中间件功能",这是我当前的代码

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

const myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

app.use(myLogger)

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

我搞不清"下一步"参数,我有以下关于中间件功能的问题

  1. "Next"的用法是什么?这是重定向到"下一个中间件功能"吗?如果是,那么是如何进行的?
  2. 如果不存在"第二中间件",那么会发生什么?
  3. 如果我们不用"下一步",那会发生什么?
  4. 我们可以重定向到"Next"中的自定义中间件吗?

推荐答案

  1. 是的,下一个参数用于将控制传递给链中的下一个中间件函数.当您调用next()时,Express将转到应用程序中注册的下一个中间件函数.这允许您创建一系列按顺序执行的中间件功能.如果省略next()或不调用它,请求将被挂起,应用程序不会移动到下一个中间件或最终的请求处理程序.

  2. 如果在app.use(myLogger)之后没有定义第二个中间件函数,则应用程序将转到最终的请求处理程序,即app.get('/', ...).最终请求处理程序负责将响应发送回客户端.在您的示例中,它发送"Hello World!"回应.

  3. 如果不调用next(),应用程序将挂起,随后的中间件函数或最终请求处理程序将不会执行.请求将不会完成,客户端最终将超时或收到错误.

  4. 可以,您可以使用next()重定向到自定义中间件函数.当使用参数(例如,next('route'))调用next()时,Express跳过链中剩余的中间件函数,并移动到下一个路由处理程序.这对于根据特定条件实现条件路由或跳过某些中间件功能非常有用.

下面是一个使用next('route')重定向到自定义中间件的示例:

const myMiddleware = function (req, res, next) {
  if (someCondition) {
    // Redirect to custom middleware
    next('route')
  } else {
    // Continue to the next middleware
    next()
  }
}

const customMiddleware = function (req, res, next) {
  // Custom middleware logic
}

app.use(myMiddleware)
app.use(customMiddleware)

app.get('/', (req, res) => {
  // Final request handler
})

Javascript相关问答推荐

假设我有2个对象,根据它们,我想要新对象

详细更改参考价值:"

使用CDO时如何将Vue组件存储在html之外?

通过实现regex逻辑自定义数据表搜索

无法将nPM simplex-noise包导入在JS项目中工作

具有相同参数的JS类

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

D3 Scale在v6中工作,但在v7中不工作

如何使用JavaScript将文本插入空div

单击ImageListItemBar的IconButton后,在Material—UI对话框中显示图像

jQuery s data()[storage object]在vanilla JavaScript中?'

更改JSON中使用AJAX返回的图像的路径

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

如何在模块层面提供服务?

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

如何将数据块添加到d3力有向图中?

钛中的onClick事件需要在两次点击之间等待几秒钟

无法避免UV:flat的插值:非法使用保留字"

打字脚本中方括号符号属性访问和拾取实用程序的区别

为什么NULL不能在构造函数的.Prototype中工作