#node _http服务: express 2
-
中间件
const express = require("express"); const app = express(); app.listen(7878); /* * 中间件 * 处理路由请求的函数叫做中间件 * 如果一个路由经过多个中间件函数,那么前面的中间件函数都必须有next()才会进入下一个中间件函数 * app.use()可以给所有的路由绑定一个中间件 * * 不能给前端(send / sendFile / end /...)多次 * * 中间件函数 * middleware ((req,res,next)=>{req.dachui = "大锤";next();}); * req res next * 所有路由请求都叫中间件:app.use() app.get()。app.use()可以给所有路由请求绑定一个中间件 * 注意:中间件一定要写在监听的路由的前面,不然中间件执行不到。 * 中间件里面的(req,res)和监听路由里面的(req,res)两个参数是一样的相等的,中间件的参数发生变化 监听函数的参数也跟着变化 * 只有前一个中间件设置了next(); 下一个中间件才会去执行,否则一直卡在此中间件不动。 * */ app.use((req,res,next)=>{ res.goudan = "狗蛋"; //中间件回个res 赋值一个goudan 属性,以便后面监听的路由可以调用到这个属性 // res.send("456789"); //一个路由请求不能,有两次send,send返回给前端第一次后后面的监听就不会再返回了。 next(); }); app.use((req,res,next)=>{ req.dachui = "大锤"; next(); }); /*各种路由的监听*/ app.get("/",(req,res)=>{ res.send(res.goudan + req.dachui); //调用前面两个中间件的 goudan 和dachui 属性:返回给前端页面的就是:狗蛋大锤 }); //本路由监听经过goudan和dachui两个中间件 app.get("/article",(req,res)=>{ res.send(res.goudan); //调用中间件的 goudan 属性:返回给前端页面的就是:狗蛋 }); //本路由监听经过goudan和dachui两个中间件
-
使用中间件提前处理所有的请求数据
后端代码:index.js const express = require("express"); const path = require("path"); const app = express(); app.listen(7878); /*使用中间件提前处理所有请求发送过来的数据:处理后的数据为一个对象形式 {} * 这个中间件不需要自己写express已经写好了,不需要我们自己再写任何东西,next等等都已经再内容写好了,照抄就可以了 * 后面的请求都会经过这两个中间件 * 同一个事件可以监听多次但是上一个请求必须有next()参数 * */ app.use(express.json()); app.use(express.urlencoded({extended:true})); app.get("/",(req,res,next)=>{ console.log(req.query); /*这是GET发送的数据拿取方式:通过在前端地址后面添加?a=3&b=4&c=555 后端req.query就能接收到这数据 /*前端发送http://127.0.0.1:7878/?a=3&b=4&c=555 get方式发送数据方式 /*后端接收到的:{ a: '3', b: '4', c: '555' } */ next(); /同一个事件可以监听多次但是上一个请求必须有next()参数 }); app.get("/",(req,res)=>{ res.sendFile(path.join(__dirname,"./test.html")); }); app.post("/",(req,res)=>{ console.log(req.body);/*这是POST发送的数据拿取方式*/ res.send({ code : 0, msg : "请求已受理", data : { aaa : "这是后端给你的数据,拿好了!!" } }); }); /* * 处理数据的中间件: * app.use(express.json()); * app.use(express.urlencoded({extended:true})); * * 如何拿取前端发送过来的数据 * GET方式 req.query * POST方式 req.body * */
前端代码:test.html <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="button" value="按钮" id="btn"> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <script> $("#btn").click(function(){ $.ajax({ type : "POST", url : "/", data : {name:"afei",age:18,kk:666}, success(msg){ console.log(msg); } }); }); </script> </body> </html>
-
中间件模块化
入口文件app.js const express = require("express"); let app = express(); app.listen(4567); app.use(express.json()); app.use(express.urlencoded({extended:true})); app.get("/",require("./middleware/index")); app.post("/",require("./middleware/indexPOST")); app.get("/article",require("./middleware/article")); app.get("/favicon.ico",require("./middleware/favicon"));
模块:/middleware/index.js const path = require("path"); module.exports = (req,res)=>{ res.sendFile( path.join(__dirname,"../test.html") ); };
模块:/middleware/indexPOST.js module.exports = (req,res)=>{ console.log(req.body);/*这是POST发送的数据拿取方式*/ res.send({ code : 0, msg : "请求已受理", data : { aaa : "这是后端给你的数据,拿好了!!" } }); };
模块:/middleware/article.js module.exports = (req,res)=>{ res.send("这是article路由"); };
模块:/middleware/favicon.js const path = require("path"); module.exports = (req,res)=>{ res.sendFile( path.join(__dirname,"./icon.png") ); };
-
子路由:router.use( );
入口文件:app.js const express = require("express"); let app = express(); app.listen(7894); /*用 use 才能使用子路由*/ app.use("/teacher",require("./routers/teacher")); /*app.get("/a/b/c/d/e/f",(req,res)=>{ res.send("访问到了/a/b/c/d/e/f"); }); app.post("/a/b/c/d/e/f",(req,res)=>{ //用post 访问了get请求 res.send("请使用get"); });*/ app.use("/a/b/c/d/e/f",(req,res)=>{ if (req.method === "GET") { res.send("这是正确的,访问到了/a/b/c/d/e/f"); }else if (req.method === "POST"){ res.send("请使用get"); } }); app.use((req,res)=>{ res.send("这是404页面"); //没监听过的路由页面,只能写在最下面,前面能访问的页面没有next() }); /* * 中间件函数 * next() * app.use * res.send() 不能重复 * * 模块化代码 * express.Router() * */
子路由模块:student.js const express = require("express"); let router = express.Router(); //子路由函数 router.get("/",(req,res)=>{ //学生的根路由 http://127.0.0.1:7894/student res.send("这是学生展示页"); }); router.use("/pika",require("./pika")); //调用pika模块 router.get("/mint",(req,res)=>{ //http://127.0.0.1:7894/student/mint res.send("薄荷"); }); router.get("/xiaoxi",(req,res)=>{ //http://127.0.0.1:7894/student/xiaoxi res.send("小希"); }); router.get("/xiaohong",(req,res)=>{ //http://127.0.0.1:7894/student/xiaohong res.send("小红"); }); router.get("/awei",(req,res)=>{ //http://127.0.0.1:7894/stundent/awei res.send("阿伟"); }); module.exports = router; //导出 router
子路由下面的子路由:afei.js const express = require("express"); let router = express.Router(); router.get("/",(req,res)=>{ //http://127.0.0.1:7894/teacher/pika 监听afei的根路由 res.send("这是皮卡卡的主页有:</br>名字</br>年龄</br>性别"); }); router.get("/name",(req,res)=>{ //http://127.0.0.1:7894/student/pika/name res.send("皮卡"); }); router.get("/age",(req,res)=>{ //http://127.0.0.1:7894/student/pika/age res.send("18"); }); router.get("/sex",(req,res)=>{ //http://127.0.0.1:7894/student/pika/sex res.send("男"); }); module.exports = router;