【javScript】Express与中间件

319 阅读4分钟

概念

express框架是什么?就是不断地调用中间件!避免原生js

  • 中间件函数是可以访问请求对象 (req),响应对象(res)以及next应用程序请求 - 响应周期中的函数的函数。该next()功能是Express路由器中的一个功能,当被调用时,它将执行当前中间件之后的中间件。

  • 中间件功能可以执行以下任务:

  1. 执行任何代码
  2. 操作请求和响应对象(req、res)
  3. 结束请求-响应周期(调用res.send()返回结果)
  4. 调用堆栈中的下一个中间件(next)。 如果当前的中间件函数没有结束请求-响应周期,则必须调用next()以将控制传递给下一个中间件函数。否则,请求将被挂起,即use被挂起,不会继续执行下面的get、put、post等等代码,死机了

使用场景

主体,返回helloworld给前端

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

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

app.listen(3000)

中间件功能myLogger

这是一个名为“myLogger”的中间件函数的简单示例。当对应用程序的请求通过时,此函数只打印“LOGGED”。中间件函数被分配给名为的变量myLogger。

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

注意上面的调用next()。调用此函数会调用应用程序中的下一个中间件函数。该next()函数不是Node.js或Express API的一部分,而是传递给中间件函数的第三个参数。该next()函数可以命名为任何东西,但按照惯例,它总是被命名为“next”。为避免混淆,请始终使用此约定。

要加载中间件功能,请调用app.use(),指定中间件功能。例如,以下代码myLogger在到根路径(/)的路由之前加载中间件函数。

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

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

app.use(myLogger)

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

app.listen(3000)

每次应用程序收到请求时,它都会向终端输出消息“LOGGED”。

中间件加载的顺序很重要:首先加载的中间件函数也会先执行。

如果myLogger在到根路径的路由之后加载,则请求永远不会到达它并且应用程序不会打印“LOGGED”,因为根路径的路由处理程序终止请求 - 响应循环。

中间件函数myLogger只是打印一条消息,然后通过调用该next()函数将请求传递给堆栈中的下一个中间件函数。

中间件功能requestTime

接下来,我们将创建一个名为“requestTime”的中间件函数,并将其添加为requestTime 对请求对象调用的属性。

var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

该应用程序现在使用requestTime中间件功能。此外,根路径路由的回调函数使用中间件函数添加的属性req(请求对象)。

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

var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

app.use(requestTime)

app.get('/', function (req, res) {
  var responseText = 'Hello World!<br>'
  responseText += '<small>Requested at: ' + req.requestTime + '</small>'
  res.send(responseText)
})

app.listen(3000)

当您向应用程序的根目录发出请求时,应用程序现在会在浏览器中显示您的请求的时间戳。

因为您可以访问请求对象,响应对象,堆栈中的下一个中间件函数以及整个Node.js API,所以中间件函数的可能性是无穷无尽的。

可配置的中间件(这个还不太了解)

如果您需要配置中间件,请导出一个接受选项对象或其他参数的函数,然后根据输入参数返回中间件实现。

//文件: my-middleware.js

module.exports = function(options) {
  return function(req, res, next) {
    // Implement the middleware function based on the options object
    next()
  }
}

现在可以使用中间件,如下所示。

var mw = require('./my-middleware.js')
app.use(mw({ option1: '1', option2: '2' }))

总结

  • 如果当前的中间件函数没有结束请求-响应周期,则必须调用next()以将控制传递给下一个中间件函数。否则,请求将被挂起,即use被挂起,不会继续执行下面的get、put、post等等代码,死机了
  • 使用app.use()加载时,也要遵守目录,如果目录参数为空,就默认加载,use一定要都放在对应的响应(get、put、post)之前,不然不会被执行到