req和res
1.nodejs如何监听http请求:
nodejs启动Web服务:
使用http模块启动服务,通过本机的IP(127.0.0.1)或本机的域名(localhost)访问服务。// 获取http模块 const http = require("http"); // 创建一个服务器 const server = http.createServer(()=>{ // 接收到请求后 console.log("已经收到了http请求") }) // 监听端口 server.listen(3000); console.log("正在监听3000端口,请访问http://localhost:3000")
2.如何拿到并使用req和res:
// 获取http模块 const http = require("http"); // 创建一个服务器 const server = http.createServer((req,res)=>{ // 接收到请求后 // console.log("已经收到了http请求") const url = req.url; const method = req.method; console.log(url); // 返回一个response res.end('hello word') }) // 监听端口 server.listen(3000); console.log("正在监听3000端口,请访问http://localhost:3000")
querystring
1.什么是querystring:
url问号?后面的都是querystring(也叫url参数);(url的hash,即url井号#后面的,不能让服务端获取)
&分割,key=value形式,可继续扩展。
2.querystring的作用:
我们可以利用querystring实现动态网页:
// 获取http模块 const http = require("http"); // 服务端拿到querystring const querystring = require("querystring"); // 创建一个服务器 const server = http.createServer((req,res)=>{ const method = req.method; const url = req.url; const path = url.split('?')[0]; // 获取queryString const queryStr = url.split('?')[1]; const query = querystring.parse(queryStr || '') // const query = {}; // queryStr && queryStr.split('&').forEach((item)=>{ // const key = item.split('=')[0] // const value = item.split('=')[1] // query[key] = value; // }) // 定义一个GET路由 if(method === 'GET' && path ==='/api/list'){ // 根据不同的query返回不同的内容,即变化querystring就变化内容 if(query.type === '1')res.end("this is a list router,all"); if(query.type === '2')res.end("this is a list router,my"); } // 定义一个POST路由,使用POSTMAN发送 // if(method === 'POST' && path ==='/api/creat'){ // res.end("this is a creat router") // } res.end("404") }) // 监听端口 server.listen(3000); console.log("正在监听3000端口,请访问http://localhost:3000")
res返回数据
1.返回json格式
// 获取http模块 const http = require("http"); // 创建一个服务器 const server = http.createServer((req,res)=>{ const method = req.method; const url = req.url; const path = url.split('?')[0]; // 定义一个GET路由 // if(method === 'GET' && path ==='/api/list'){ // const result = { // errno:0, // data:[ // {user:"李四",content:"你们好"}, // {user:"李san",content:"dajia好"}, // ] // } // res.writeHead(200,{'Content-type':'application/json'}); // res.end(JSON.stringify(result)) // res.end(result); // } // 定义一个POST路由,使用POSTMAN发送 if(method === 'POST' && path ==='/api/create'){ const result = { errno:0, message:"收到留言啦" } res.writeHead(200,{'Content-type':'text/plain'}); res.end(JSON.stringify(result)); } res.end("404") }) // 监听端口 server.listen(3000); console.log("正在监听3000端口,请访问http://localhost:3000")
2.返回html格式数据(了解)
if(method === 'GET' && path ==='/api/list'){ res.writeHead(200,{'Content-type':'text/html'}); res.end( `<DOCTYPE html> <html> <head> <title>404</title> </head> <body> 404 Not found </body> </html>` )}
获取Requst body
1.流
1)浏览器能接收流(stream)数据:
服务端res.end(...),会自动以流的形式返回;
浏览器会识别到流,并持续接收信息(会有进度条);
待全部接收完,再做显示或处理(视频是一段一段播放的)
2)服务端如何接收流(stream)数据
前端使用Ajax提交数据Request Body;
服务端需要识别流,并接受数据;
还要知道合适才能接收完成
2.代码体验:
// 获取http模块
const http = require("http");
// 创建一个服务器
const server = http.createServer((req,res)=>{
const method = req.method;
const url = req.url;
const path = url.split('?')[0];
// 获取前端传递过来的数据的数据类型
const reqType = req.headers['content-type']
// 定义一个GET路由
if(method === 'POST' && path ==='/api/create'){
let bodyStr = '';
// 获取数据流,chunk是一段一段的数据
req.on('data',chunk=>{
// 连接数据(转换成字符串保存在bodyStr中)
bodyStr += chunk.toString();
})
// 数据流接收完成
req.on('end',()=>{
// 如何把接收的json类型数据转换成json类型
// 1.要判断前端传递的数据类型是否为json类型
if(reqType === "application/json"){
// 2.使用JSON.parse()转换
const body = JSON.parse(bodyStr);
console.log('body is',body );
}
res.end('接收完成')
})
// 如果命中此路由,则返回
return;
}
// 如果没有命中路由,才会返回下面的
res.writeHead(200,{'Content-type':'text/html'});
res.end(
`<DOCTYPE html>
<html>
<head>
<title>404</title>
</head>
<body>
404 Not found
</body>
</html>`
)
})
// 监听端口
server.listen(3000);
console.log("正在监听3000端口,请访问http://localhost:3000")