什么是中间件?
中间件,即Middleware,是系统软件和用户应用软件之间连接的软件,以便于软件各部分之间的沟通。就好比,前端发送请求到服务端,服务端可能存在很多复杂的逻辑,所以就需要中间件,服务端收到请求通过中间件来判断是否有权限去访问下一步,可以就继续访问,不行就返回。当然这只是中间件其中一种功能,另外还有非常多的功能需要探索,接下来就主要讲一下比较常用的中间件。
全局中间件
app.use(function (req, res, next) {
console.log('Time:', Date.now())
req.reqestTime = Date.now()
next()
})
当我们启动服务,我们会看到服务打印的内容,会先进过全局中间件
除了req,res这两个参数使我们熟知的以外,这个next也必须说一下,关于next,当我们去执行它的时候,我们就会执行下一步,但是如果当我们不写
next()
,页面会一直卡在中间件这里,无限转圈。
ps:上一篇中提到了,app.all(),其实也可以把这个看过中间件,当我们服务经过全局中间件那里的时候,next会去寻找符合条件的服务,此时app.all是包含所有的类型的请求,所以我们也接下来也会经过它,然后再去执行,下一个符合条件的操作。
app.all('*',function(req,res,next){
console.log('所有请求')
next()
})
开放跨域请求
app.ues(function(req,res,next){
//设置允许跨域,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin","*")
//允许的header类型
res.header("Access-Control-Allow-Headers","content-type")
//允许跨域的请求方式
res.header("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS")
if(req.method === "OPTIONS")res.sendStatus(200) //让options尝试请求快速结束
else next()
})
express自带中间件
1、json格式数据中间件,它使用JSON有效载荷解析传入请求,并且基于身体解析。返回只解析JSON的中间件,并且只查看Content-Type报头与type选项匹配的请求。express.json
将接口参数传递有两种形式,要么就是body,要么就是url拼参数传递。
app.post("/test", (req, res) => {
console.log(req.query)
console.log(req.body)
res.send("ok")
})
① 假如我们的传递形式是这样的:http://localhost:8080/test?name='zhangsan'&age=18
query我们可以拿到,但由于我们不是靠body传值,所以此时是undefined
② 假如我们传递形式是json:
此时我们打印的结果还是和①一样,说明我们无法转义json,所以就需要加上
app.use(express.json())
2、静态文件中间件。express.static()
首先创建一个public的文件夹来存放我们的静态文件。其次选取一张照片存入public文件夹。
接着我们写上
const path = require("path")
app.use(express.static(path.join(__dirname, "public")))
启动服务输入http://localhost:8080/1.jpg
就可以看到图片,当然如果public文件夹里面又创建了一个文件夹,同样的,在1.jpg前面加上那个文件夹名,例如http://localhost:8080/abc/1.jpg
其中abc就是文件夹名。
3、路由中间件。express.Router()
所有路由请求如果都写在app.js会显得冗余,我们需要把不用逻辑的路由抽取到不用的js文件中去,增加可读性和减少耦合性。
创建文件./routerTestRouter.js
文件
const express = require("express")
var router = express.Router()
//get请求接口
router.get("/test",function(req,res){
res.send(req.body)
})
module.exports = router
app.js加入下面代码
//把TestRouter路由添加到app中
app.use("/test",require("./router/TestRouter"))
//路由中的/test接口,访问路径 -> /test/test