node —— get/post传值 + 路由封装

一、get/post传值

1. get传值

直接通过路径传值

取值:
  • 引入url模块:let url = require("url")
  • 解析路径:let queryStr = url.parse(req.url,true)第二个参数为true会将query中的值解析成json类型
  • 获取query中的数据:let params = queryStr.queryparams为路径上所传的参数集合
2. post传值

通过body传值

取值
  • 引入url模块:let url = require("url")
  • 引入querystring模块:let queryString = require("querystring")
  • 通过reqdata事件监听函数,可以接收到请求体的数据(数据太多时不是一次性传完。接收到的为二进制数据,需要通过toString()方法将其转成字符串
  • reqend事件监听函数,进行数据的发送(发送到ejs文件中)/渲染到页面上
  • 由于在data事件监听函数中将请求体的数据转换成字符串类型,故需要通过queryString .parse(str)将其转换成json数据类型
const queryString = require("querystring")

 let reqData = ""
            req.on("data", (res) => {
                //接收请求体的数据
                reqData = res.toString()
            })
            req.on("end", () => {
                ejs.renderFile("view/dologin.ejs", {
                    data: queryString.parse(reqData)//将最终的传值转换成`json`数据类型
                },(err, str) => {
                    console.log(str)
                    res.end(str)
                })
            })

二、路由封装

在node中,通过路径的不同可以选择让其渲染不同的页面。我们可以通过路由封装,让服务端回调函数代码看起来更加整洁
可通过res.method来判断当前请求是什么方式的请求,然后对不同方式的请求进行不同的封装(下例只是对get请求进行了路由封装

//未进行路由封装的代码
module.exports = (req, res) => {
    let path = url.parse(req.url).pathname
    if (req.url != "/favicon.ico") {
        res.writeHead(200, { "Content-type": "text/html;charset=utf-8" });
        //res.write("首页");//如果不用write方法,可以直接在end中打印内容:res.end("首页")
        if (path == "/") {
            ejs.renderFile("view/index.ejs", {
                student: data//data为引入data.json外部模块的名称
            }, (err, str) => {
                res.end(str);//res为回调函数的res参数。将str渲染到页面上
                console.log(err)
            });
        } else if (path == "/login") {
            res.end("login.html")
        } else if (path == "/register") {
            //get传值  取到值 url.parse(req.url,true).query
            let urlInfo = url.parse(req.url, true);
            ejs.renderFile("view/register.ejs", {
                str1: 123
            }, (err, str) => {
                res.end(str)
            })
        } else if (path == "/dologin") {
            let reqData = ""
            req.on("data", (res) => {
                //接收请求体的数据
                reqData = res.toString()
            })
            req.on("end", () => {
                ejs.renderFile("view/dologin.ejs", {
                    data: queryString.parse(reqData)
                },(err, str) => {
                    console.log(str)
                    res.end(str)
                })
            })
        }
        // res.end()
    }
}
//进行路由封装的代码
//服务端回调函数.js
const url = require("url");
const obj = {}
const router = require(".././module/router")
 let app = (req,res)=>{
     console.log(url.parse(req.url,true))
    let path = url.parse(req.url,true).pathname;
    if(path!="/favicon.ico"){
        res.writeHead(200,{ "Content-type": "text/html;charset=utf-8" })
       if(obj[path]){
       //如果路径存在,通过不同的路径匹配不同的ejs页面
           obj[path](req,res)
       }
    }
}
app.get=(string,callback)=>{
    obj[string] = callback
}
app.get("/",(req,res)=>{
 
    router["home"](req,res)
})
app.get("/login",(req,res)=>{
    router["login"](req,res)
})
app.get("/regest",(req,res)=>{
    router["regest"](req,res)
})
module.exports =app

//router.js
//使用ejs进行路由配置
const ejs=require("ejs");
let router={
    "home":(req,res)=>{
        ejs.renderFile("views/home.ejs",(err,str)=>{
            console.log(111)
             if(err)
             {
                throw err;
             }
             res.end(str);
        });
    },
    "login":(req,res)=>{
        ejs.renderFile("views/login.ejs",(err,str)=>{
             if(err)
             {
                throw err;
             }
             res.end(str);
        });
    },
    "regest":(req,res)=>{
        ejs.renderFile("views/regest.ejs",(err,str)=>{
             if(err)
             {
                throw err;
             }
             res.end(str);
        });
    }
}
module.exports=router;
发布了72 篇原创文章 · 获赞 72 · 访问量 6304

猜你喜欢

转载自blog.csdn.net/weixin_43314846/article/details/103310881
今日推荐