中间件的概念
Express的中间件,本质上就是一个function处理函数,Express中间件格式如下
app.get('/',function(req,res,next){
next()
})
// 全局生效中间件
app.use(function (req,res,next){
console.log('这是一个最简单的中间件函数')
next()
})
// 局部生效中间件
const mw = function (req,res,next){
req.results = [1,2] // 供后续中间件使用
next()
}
// mw 这个中间件只能在当前路由中生效
app.get('/',mw,function(req,res,next){
next()
})
// mw 这个中间件不会影响下面这个路由
app.get('/user',mw,function(req,res,next){
next()
})
注意:中间件函数的形参列表中,必须包含 next 参数。而路由处理函数中只包含 req 和 res。
next 函数的作用
next 函数 是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件。
中间件的作用
多个中间件之间,共享同一份 req 和 res 。基于这样的特征,我们可以在上游的中间件中,统一为 req 或 res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
路由的使用
创建路由模块 router.js
const express = require("express");
const router = express.Router();
router.get("/user",(req,res)=>{})
module.exports = router;
注册路由模块 app.js
// 导入路由模块
const userRouter = require("./router.js")
// 注册路由模块
app.use(userRouter)
// 加入前缀
app.use("/api", userRouter);
获取URL中携带的查询参数
通过 req.query对象可以访问到客户端通过查询字符串的形式,发送到服务器的参数
app.get('/',(req,res)=>{
// req.query默认是一个空对象
// 获取 ?name=zs&age=20这种形式的参数
console.log(req.query)
})
获取URL中的动态参数
通过 req.params对象,可以访问到URL中通过 : 匹配到的动态参数
// URL地址中,可以通过:参数名的形式匹配动态参数值
app.get('/user/:id',(req,res)=>{
// req.params 默认是一个空对象
// 里面存放这通过 : 动态匹配到点的参数值
console.log(req.params)
})
express.static()
express.static函数可以非常方便的创建一个静态资源服务器,通过如下代码就可以将public目录下的图片、css文件、js文件对外开放访问。
const express = require("express");
const app = express();
app.use(express.static('public'))
// 现在,你就可以访问 public 目录中的所有文件了
// http://localhost:3000/images/bg.jpg
// http://localhost:3000/css/style.css
// http://localhost:3000/ijsmages/login.js
// 托管多个静态资源目录,只需多次调用
app.use(express.static('public'))
app.use(express.static('files'))
// 如果希望在托管静态资源访问路径之前,挂载路径前缀
app.use('/public',express.static('public'))
// http://localhost:3000/public/images/bg.jpg
注意:Express在指定的静态目录中查找文件,并对外提供资源的访问路径。因此,静态文件的目录名不会出现在URL中。