一一对应 对应的请求方式和路径
一种映射关系,必须含有三个部分:请求方式请求url处理函数
app.get('/',function(){
console.log(1);
})
app.post('/',()=>{})
app.put('/',()=>{})
app.delete('/',()=>{})
路由匹配规则:
匹配请求方式和路径,两者全部匹配就会调用后面的回调函数
路由的模块化
//express。js
//监听端口
constexp=require('express')
constrouther=require('./路由')
constapp=exp()
app.use(routher.routher)
//端口号
app.listen("8080",function(){
console.log("http://127.0.0.1:8080");
})
//路由。js
constexpress=require("express")
constrouther=express.Router()
routher.get('/',function(){
console.log("get");
})
routher.post('/',(req,res)=>{
console.log("post");
})
module.exports.routher=routher
路由前缀
可以规定访问路由前使用什么前缀
app.use('/api',routher.routher)
中间件
上一个流程的结束是下一个流程的开始
本质:处理函数,处理函数中必须包含next参数
next函数的作用参数
当上一个中间件结束后调用next函数,next的作用指向下一个中间件或者是路由
定义中间件
constexpress=require('express')
constapp=express()
constmw=(req,res,next)=>{
console.log("第一个中间件");
}
app.use(mw)//注册中间件
app.listen(80,()=>{
console.log("http://127.0.0.1:80");
})
全局中间件
全局生效的中间件
客户端发起任何请求;到达服务器后,都会触发的中间件,叫全局生效中间件
constexpress=require('express')
constapp=express()
consta=(req,res,next)=>{
console.log("第二个中间件");
next()
}
constmw=(req,res,next)=>{
console.log("第一个中间件");
next()
}
app.use(a)
app.use(mw)
app.get('/',(req,res)=>{
console.log("路由");
})
app.listen(80,()=>{
console.log("http://127.0.0.1:80");
})
多个中间件之间共用一个req,res
constexpress=require("express");
constapp=express();
constmw= (req, res, next) => {
req.time=Date.now();
next();
};
consta= (req, res, next) => {
console.log("第二个中间件");
next();
};
app.use(mw);
app.use(a);
app.get("/", (req, res) => {
console.log(req.time);
});
app.listen(80, () => {
console.log("http://127.0.0.1:80");
});
局部中间件
constexpress=require("express");
constapp=express();
constmw= (req, res, next) => {
req.time=Date.now();
next();
};
consta= (req, res, next) => {
console.log("第二个中间件");
next();
};
app.get("/api",a, (req, res) => {
console.log(req.time);
});
app.listen(80, () => {
console.log("http://127.0.0.1:80");
});
注册多个局部生效的中间件
constexpress=require("express");
constapp=express();
constmw= (req, res, next) => {
req.time=Date.now();
console.log(11);
next();
};
consta= (req, res, next) => {
console.log("第二个中间件");
next();
};
// 共用同一个req,res
app.get("/api",[mw,a], (req, res) => {
console.log(req.time);
});
app.listen(80, () => {
console.log("http://127.0.0.1:80");
});
注意事项:
使用中间件一定要在路由之前注册
在中间件处理结束之后一定要调用next函数,不要再next函数之后再写其他代码
可以触发多个中间件
多个中间件和路由之间共用一个req,res
中间件分类:
应用级别的中间件--使用app.use,app.get,注册的中间件都是应用级别的中间件
路由级别的中间件--使用express.routher注册的中间件就是路由级别的中间
错误级别的中间件---存在第四个参数,err
内置中间件
experss.static---管理静态资源
express.json--处理json格式数据的中间件
experss.enurllcoded--处理表单格式数据的中间件
constexpress=require("express");
constapp=express();
// 中间件
app.use(express.json({extended:true}))
app.post('/',(req,res)=>{
console.log(req.body);
})
app.listen(80, () => {
console.log("http://127.0.0.1:80");
});
第三方中间件
自定义中间件
模拟express enurlcoded中间件,实现功能
name=zhangsan&password=123=>{},可以在req.body里面获取到这
constexpress=require("express");
constquerystring=require('querystring')
constapp=express();
app.use(function (req, res, next) {
letstr="";
// 监听数据请求的开始,数据开始上传开始触发
req.on("data", (chunk) => {
str+=chunk;
});
// 监听数据请求的结束,数据上传结束触发
req.on("end", () => {
// querystring.parse:将字符串类型的键值对数据(id=1&name=zhangsan)转化成对象格式({id:1})
// querystring.stringify:将对象格式的数据转化成字符串的键值对
req.body=querystring.parse(str);
next()
});
});
app.post("/", function (req,res) {
console.log(req.body);
});
app.listen(80, () => {
console.log("http://127.0.0.1:80");
});