作用: 我们知道传统的HTPP服务器会由Aphche、Nginx、IIS之类的软件来担任,但是nodejs并不需要,nodejs提供了http模块,自身就可以用来构建服务器,而且http模块是由C++实现的,性能可靠。我们在nodejs中的教程或者书籍中常常会通过一个简易的http服务器来作为开头的学习。
createServer函数
想要用node搭建一个服务器,这个函数是首要的。注意,需要先用require引入http模块
http.createServer([option],[requestListener])
参数一 [option]:可选配置项(我们一般情况下用不上)
参数二 [requestListener] 请求监听
用一个实例来解释把。要求:请求页面发送请求给服务器,服务器判断请求的路径是否是文件、是否是目录、是否不存在该路径
directory是一个空目录,default是访问目录时跳转的页面,main是访问的路径
default文件内容
<h1>访问目录时</h1>
main文件内容
<h1>路径正确时</h1>
login.html文件内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button id="loginBtn">登录</button>
<script>
let loginBtn = document.getElementById("loginBtn");
//利用原生js的异步操作来访问node创建的服务器
loginBtn.onclick = function() {
let xhr = new XMLHttpRequest();
//在这里修改请求路径
let url = `http://localhost:8888/direcory`;
xhr.open("POST", url, true);
xhr.send();
xhr.onreadystatechange = function() {
if(this.readyState==4 && this.status==200){
let rs=this.responseText;
console.log(rs);
if(rs=="file"){
window.location="./main.html";
}else if(rs=="directory"){
window.location="./default.html";
}
}
}
}
</script>
</body>
</html>
login.js文件目录
const http = require("http");
const path=require("path");
const fs=require("fs");
let server = http.createServer((request, response) => {
//解除同源禁止策略
response.setHeader('Access-Control-Allow-Origin', '*');
//注意request.url所获取的是端口号后面的地址
let urlPart=request.url;
//通过path模板来拼接请求文件的完整路径
let urlComplete = path.resolve(__dirname, urlPart.substring(1));
try {
//将异步操作变成同步,不加Sync的话,此函数便是一个异步回调函数,无法获取数据
let file = fs.statSync(urlComplete);
//判断指定路径是文件还是目录还是错误路径,根据类型使页面跳转到不同页面
if(file.isFile()){
response.write("file");
}else if(file.isDirectory()){
response.write("directory");
}
} catch (error) {
//文件不存在时,将返回状态码定义成404
response.statusCode="404"
console.log("访问路径错误");
}
//结束请求
response.end();
});
//定义监听的端口号
server.listen(8888);
拓展
在服务器中获取页面传输的参数时。需要区分get请求和post请求,不同请求的解析方式不同。
get请求
const http = require("http");
const url = require("url");//导入url模板用于解析url,获取到请求所带参数
let server = http.createServer((request, response) => {
//利用url模板将请求的地址的信息转换成对象形式,用以获得相关内容
let urlObj = url.parse(request.url, true);
//用query属性获取到请求的参数
let data = urlObj.query;
console.log(data);
//结束请求
response.end();
});
//定义监听的端口号
server.listen(8888);
post请求
const http = require("http");
let server = http.createServer((request, response) => {
let content='';
//两个事件挂载搭配来获取
request.on("data",chunk=>{
content+=chunk.toString("utf-8");
});
request.on('end', () => {
console.log("请求体获取完毕", content);
})
console.log(content);
//结束请求
response.end();
});
//定义监听的端口号
server.listen(8888);
html页面与node服务器交互时数据传输方式
一边情况下通过json文件传输
服务器中,先将数据转换成json文件
let rs={
user:"admin",
psd:"123456",
type:""
}
response.write(JSON.stringify(rs));
页面中,利用回调函数接收数据后,将json文件转变回去
let rs=this.responseText;
let newRs=JSON.parse(rs);