node.js学习之http模块
回顾:什么是客户端,什么是服务器
在网络中负责消费资源的电脑叫做客户端而负责对外提供网络资源的电脑则被叫做服务器
HTTP模块便是Node.js官方提供的用来创建web服务器的模块,通过http.createServer( )
方法对外提供资源,从而将普通的电脑编程一台服务器
http模块的具体作用
服务器和电脑的区别在于服务器上安装了web服务器软件。而对于前端在Node.js中我们不需要使用IIS/Apache等第三方的web软件,只需要利用Node.js的http模块便可以实现对外提供web服务的功能
服务器的相关概念:
一、IP地址:互联网上的每一台计算机的唯一地址,是唯一的。常用的格式为”点分十进制“,如:192.168.1.1,每一个数字都是0~255之间的十进制整数。
二、在互联网中每一台web服务器也拥有自己的ip地址,通过终端中的 ping命令可以查询对应网站的IP地址
三、域名和域名服务器:域名是IP地址的别名,IP和域名是一一对应的关系,这份对应关系被存放在域名服务器当中(DNS服务器),在用域名访问网站的时候DNS服务器还会将域名转换为IP地址。
域名的作用在于便于记忆和访问网站。
四、在开发和测试的环境中也有本地服务器的IP“127.0.0.1”它对应的域名是“localhost”。
五、端口号类似于门牌号,在每一台电脑中可以运行多个Web服务,而不同的web服务都有对应的一个唯一的端口号。每一个端口号不能被多个web服务所占用。在实际应用中,URL的80端口是可以被省略的。
利用http模块创建基本的web服务器
步骤:
一、导入http模块
二、创建web服务器示例
三、为服务器绑定request事件,监听客户端请求
四、启动服务器
req请求对象
只要服务器介绍到了客户端的请求,就会触发server.on()为服务器绑定的request事件处理函数,如果想在request事件处理函数中访问与客户端相关的数据或属性,可以使用如下方式:
const http = require('http')
const server = http.createServer()
// 参数req就是请求对象,其中包含了与客户端相关的数据和属性
server.on('request',(req)=>{
// req.url 是客户端请求的URL低脂
const url = req.url
// req.method 是客户端请求的method类型
const method = req.method
const str = `Your request url is ${url},and request method is ${method}`
console.log(str)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
res响应对象
在服务器的request事件处理函数中如果想访问与服务器相关的数据或属性可以使用一下方式:
const http = require('http')
const { send } = require('process')
const server = http.createServer()
// 参数req就是请求对象,其中包含了与客户端相关的数据和属性
server.on('request',(req,res)=>{
// req.url 是客户端请求的URL低脂
const url = req.url
// req.method 是客户端请求的method类型
const method = req.method
const str = `Your request url is ${url},and request method is ${method}`
console.log(str)
// 防止中文显示乱码,调用res.setHeader()方法和设置Content-type响应头来解决
res.setHeader('Content-type','text/html; charset=utf-8')
// 调用res.end方法,向客户端响应一些内容
res.end(str)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
根据不同的URL来响应不同的内容
具体实现
const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
// 一、获取请求的url地址
const url = req.url
// 二、设置默认的响应内容为 404 NOT found
let content = '<h1>404 Not found!</h1>'
// 三、判断用户请求的是否为/ 或者/idnex.html首页
// 四、判断用户的请求是否为/about.html关于页面
if(url === '/' || url === '/index.html'){
content = '<h1>首页</h1>'
}else if(url === '/about.html'){
content = '<h1>关于页面</h1>'
}
// 五、设置Content-type响应头,防止中文乱码
res.setHeader('Content-type','text/html; charset=utf-8')
// 六、使用res.end() 方法,把内容响应给客户端
res.end(content)
})
server.listen(80,()=>{
console.log('server running at http://127.0.0.1')
})
案例:实现clock时钟的web服务器
实现思路:
把文件的实际存放路径作为每个资源的请求url地址
实现步骤:
一、导入需要的模块
const http = require('http')// http模块
const fs = require ('fs')// 文件系统模块
const path = require('path')// 路径处理模块
二、创建基本的web服务器
const server = http.createServer()
// 监听web服务器的request的事件
server.on('request',(req,res)=>{ })
// 启动web服务器
server.listen(80,()=>{
console.log('server listen at http://127.0.0.1:80')
})
三、将资源的请求url地址映射为文件的存放路径
// 获取到客户端请求的 URL 地址
const url = req.url
// 将 URL 地址映射为本地的文件存放路径
const fpath = path.join(__dirname,url)
四、读取文件的内容并响应给客户端
// 根据映射过来的文件路径读取文件
fs.readFile(fpath,'utf8',(err,dataStr)=>{
//读取失败
if(err) return res.end('404 Not found!')
res.end(dataStr)
})
五、优化以上步骤 实现最终效果
const http = require('http')// http模块
const fs = require ('fs')// 文件系统模块
const path = require('path')// 路径处理模块
// 创建web服务器
const server = http.createServer()
// 监听web服务器的request的事件
server.on('request',(req,res)=>{
// 获取到客户端请求的 URL 地址
const url = req.url
// // 将 URL 地址映射为本地的文件存放路径
// const fpath = path.join(__dirname,url)
// 优化
let fpath = ''
if(url === '/'){
fpath = path.join(__dirname,'/clock/index.html')
}else{
fpath = path.join(__dirname,'/clock',url)
}
// 根据映射过来的文件路径读取文件
fs.readFile(fpath,'utf8',(err,dataStr)=>{
// 读取失败
if(err) return res.end('404 Not found!')
// 读取成功,将内容响应给客户端
res.end(dataStr)
})
})
// 启动服务器
server.listen(80,()=>{
console.log('server listen at http://127.0.0.1:80')
})