node _http服务: express 2

#node _http服务: express 2

  1. 中间件

    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两个中间件
    
  2. 使用中间件提前处理所有的请求数据

    后端代码: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>
    
  3. 中间件模块化

    入口文件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") );
    };
    
  4. 子路由: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;
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
URIError: Failed to decode param '/%=%20BASE_URL%20%%3Efavicon.ico' at decodeURIComponent (<anonymous>) at decode_param (Z:\shhfw\node_modules\express\lib\router\layer.js:172:12) at Layer.match (Z:\shhfw\node_modules\express\lib\router\layer.js:123:27) at matchLayer (Z:\shhfw\node_modules\express\lib\router\index.js:585:18) at next (Z:\shhfw\node_modules\express\lib\router\index.js:226:15) at expressInit (Z:\shhfw\node_modules\express\lib\middleware\init.js:40:5) at Layer.handle [as handle_request] (Z:\shhfw\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (Z:\shhfw\node_modules\express\lib\router\index.js:328:13) at Z:\shhfw\node_modules\express\lib\router\index.js:286:9 at Function.process_params (Z:\shhfw\node_modules\express\lib\router\index.js:346:12) at next (Z:\shhfw\node_modules\express\lib\router\index.js:280:10) at query (Z:\shhfw\node_modules\express\lib\middleware\query.js:45:5) at Layer.handle [as handle_request] (Z:\shhfw\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (Z:\shhfw\node_modules\express\lib\router\index.js:328:13) at Z:\shhfw\node_modules\express\lib\router\index.js:286:9 at Function.process_params (Z:\shhfw\node_modules\express\lib\router\index.js:346:12) at next (Z:\shhfw\node_modules\express\lib\router\index.js:280:10) at Function.handle (Z:\shhfw\node_modules\express\lib\router\index.js:175:3) at Function.handle (Z:\shhfw\node_modules\express\lib\application.js:181:10) at Server.app (Z:\shhfw\node_modules\express\lib\express.js:39:9) at Server.emit (node:events:390:28) at parserOnIncoming (node:_http_server:951:12) at HTTPParser.parserOnHeadersComplete (node:_http_common:128:17)
06-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值