node.js中有个http的模块 它可以开启一个服务器用
const http = require('http')//导入http模块
const fs = require('fs')//导入fs模块
const url = require('url')//导入url模块
const querystring = require('querystring')//导入querystring模块
const app= http.createServer((req,res)=>{
//这里创建一个服务器 里面有两个参数 第一个是请求request 第二个是响应response
// console.log(req.url)//这个是获取请求的地址
//首先排除 / favicon.ico的请求
if(req.url.indexOf('/favicon.ico')===-1){
//这里用字符串的方法indexof来判断请求地址里面是否有‘/favicon.ico’这个内容
//如果没有返回-1 所以if里面的条件为true的时候执行
//排除玩上面的字符串然后判断是静态资源还是动态资源(api)
//如果是api接口
if(req.url.indexOf('/api')!==-1){
//处理地址栏的数据 类似与get请求
//用url.parse()方法把地址字符串变成地址对象 然后获取到他的 query 属性的值 也就是变量data的值
//url.parse的第二个参数如果不写则data 的值就是一个字符串 如果我们想要获取请求携带的参数,需要我们用 字符串的split方法去切割
//写上参数true 的时候自动会转化为对象
let data = url.parse((req.url),true).query//得到地址栏上携带的参数
console.log(data)
//处理不在地址栏的数据 类似与post请求
let noaddress = ''// 创建一个存放非地址栏参数的变量
req.on('data',chunk=>{//chunk表示抓取的一片数据 data事件会频繁出触发
noaddress+=chunk
})
req.on('end',()=>{
console.log('非地址栏的数据',querystring.parse(noaddress))
//最后把这个地址字符串转化为对象
//这里我们的到的noaddress是一个参数的字符串并非是一个地址
//所以不能用url.parse进行解析
//所以要用到querystring模块的方法
//把这个参数的字符串用 qeurystring.parse()方法转化为一个对象
})
}else{//静态资源
try {
let path = req.url==='/' ? './index.html' : req.url
//这里用三目运算符 如果请求的req.url 为 ‘/’ 则直接请求首页
//如果不是则请求req.url的值
// res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'}) //设置请求头
// res.write('你好世界')这里直接写入内容 如果是中文 则需要进行设置请求头的格式 不然会出现中文乱码
let data = fs.readFileSync(path)//如果直接用fs模块的这个方法同步去读这个路径则不用设置格式 把读出的内容赋值给一个变量
res.write(data)//将data返回浏览器渲染出来
} catch (error) {
let data = fs.readFileSync('./html/hello.html')//如果请求的地址出现错误则直接让他去读一个错误的页面
res.write(data)
}
}
}
res.end()//结束请求 不然浏览器会一直请求
})
app.listen(5000)//设置监听的端口号 不写域名 默认为localhost