nodejs之express的中间件
express中间件分成三种
内置中间件 static
const express = require("express"); const app = express(); // test1接口 app.get("/test1",(req,res) => { res.send("test1 ok") }) // test2接口 app.get("/test2",(req,res) => { res.send("test2 ok") }) // 开启服务器 app.listen(2000,() => { console.log('开启在2000端口'); })
const express = require("express"); const app = express(); app.use("/",(req,res,next)=>{ console.log("中间件") }) // test1接口 app.get("/test1",(req,res) => { console.log('test1'); res.send("test1 ok") }) // test2接口 app.get("/test2",(req,res) => { console.log('test2'); res.send("test2 ok") }) // 开启服务器 app.listen(2000,() => { console.log('开启在2000端口'); })
现在在浏览器中请求/test1 没有响应,在终端中打印出来
这个中间件的作用在于 请求/开头的路径时 优先走中间件的回调函数 中间件里的next()表示是否继续往下执行 ,有next()就继续往下走, 没有next()就不往下走
const express = require("express"); const app = express(); app.use("/",(req,res,next)=>{ console.log("中间件") next() // 是否继续往下执行 }) // test1接口 app.get("/test1",(req,res) => { console.log('test1'); res.send("test1 ok") }) // test2接口 app.get("/test2",(req,res) => { console.log('test2'); res.send("test2 ok") }) // 开启服务器 app.listen(2000,() => { console.log('开启在2000端口'); })
页面中
终端打印
简单来说 在来到/test1接口之前 有个拦截器,这个拦截器中的路径是/, 所有的接口都先走这个拦截器,在这个拦截器里做逻辑处理,允许它继续往下走就加next() ,不允许往下走就不用加next(), 因此验证上文提到的token,就可以在中间件里进行
const express = require("express"); const app = express(); app.use("/",(req,res,next)=>{ console.log("中间件") let {token} = req.query; if(token){ next() // 是否继续往下执行 }else{ res.send("缺少token") } }) // test1接口 app.get("/test1",(req,res) => { console.log('test1'); res.send(`test1 token为${req.query.token}`) }) // test2接口 app.get("/test2",(req,res) => { console.log('test2'); res.send(`test2 token为${req.query.token}`) }) // 开启服务器 app.listen(2000,() => { console.log('开启在2000端口'); })
浏览器中访问/test1 不带token字段
现在带上token字段访问/test2
这就实现了通过中间件做全局拦截,这种中间件属于自定义拦截器.如果app.use()的第一个参数是 / 表示路径,则第一个参数可以不写,如下
app.use("/",(req,res,next)=>{ next() // 是否继续往下执行 })
等同于
app.use((req,res,next)=>{ next() // 是否继续往下执行 })
这也可以说为什么body-parser是一个中间件
const bodyparser = require("body-parser"); app.use(bodyparser.urlencoded({extended:false})) app.use(bodyparser.json())
const express = require("express"); const app = express(); app.get("/demo",(req,res,next) => { console.log('fun1'); },(req,res) => { console.log('fun2'); }) // 开启服务器 app.listen(2000,() => { console.log('开启在2000端口'); })
在第一个回调函数中加上next()看看
const express = require("express"); const app = express(); app.get("/demo",(req,res,next) => { console.log('fun1'); next() },(req,res) => { res.send("fun2") console.log('fun2'); }) // 开启服务器 app.listen(2000,() => { console.log('开启在2000端口'); })
浏览器中访问/demo
终端打印
这种叫局部中间件,局部中间件是 在哪个接口里写就只对哪个接口有用,局部中间件可以写无数个 只要在合适的地方使用next()就可以一个接一个的往下执行,一般情况下使用局部中间件最多使用一两个就够了 使用多个局部中间件 代码结构如下
app.get("/test",fun1,fun2,fun3,fun4,fun5..)
app.use(express.static("./public"))
在public目录下新建一个index.html文件 写上内容
浏览器访问/index.html
app.use("/",express.static("./public"))
app.use("/public/test/",express.static("./public"))
浏览器访问时应该输/public/test/index.html了
上一篇: Linux学习历程(持续更新整理中)
下一篇: 经典两小笑话精选哒