一、get/post
传值
1. get
传值
直接通过路径传值
取值:
- 引入
url
模块:let url = require("url")
- 解析路径:
let queryStr = url.parse(req.url,true)
(第二个参数为true会将query
中的值解析成json
类型) - 获取query中的数据:
let params = queryStr.query
(params为路径上所传的参数集合)
2. post
传值
通过
body
传值
取值
- 引入
url
模块:let url = require("url")
- 引入
querystring
模块:let queryString = require("querystring")
- 通过
req
的data
事件监听函数,可以接收到请求体的数据(数据太多时不是一次性传完。接收到的为二进制数据,需要通过toString()
方法将其转成字符串) - 在
req
的end
事件监听函数,进行数据的发送(发送到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;