node模拟一个简单的服务器
1. http模块
在搭建服务器之前,我们先来说一下http模块。
http模块是node的核心模块,它的作用就是创建http服务器。
1.1 request请求对象:
常见属性:
① headers: 所有的请求头信息
② method: 请求的方式
③ rawHeaders: 所有的请求头信息(数组的方式)
④ url: 请求的地址
仅在 http.Server 返回的请求中有效。
返回请求的 URL 字符串。 仅包含实际 HTTP 请求中的 URL
小结:request对象中,常用的就是method和url两个参数
1.2 response响应对象
常见属性:
① res.write(data)
给浏览器发送响应体,可以调用多次,从而提供连续的响应体
② res.end()
通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为已完成。
③ res.end(data)
结束请求,并且响应一段内容,相当于res.write(data) + res.end()
④ res.statusCode
设置响应的的状态码, 常见的状态码有 200 404 500
res.statusCode = 404 //一般资源不存在时,设置为404
⑤ res.statusMessage
响应的状态信息, OK 或 Not Found ,会根据statusCode自动设置,一般无需设置。
⑥ res.setHeader(name, value)
设置响应头信息, 比如content-type
注意:必须先设置响应头,才能设置响应体。
res.setHeader('content-type', 'text/html;charset=utf-8')
⑦ res.writeHead(statusCode, statusMessage, options)
设置响应头,同时可以设置状态码和状态信息。
res.writeHead(404, {
'content-type': 'text/html;charset=utf-8'
})
2. 创建服务器基本步骤
① 导入http模块
const http = require('http)
const path = require('path') //导入path路径模块,用于处理文件与目录的路径
const fs = require('fs') //导入fs文件模块,用于读取或写入文件等操作
const mime = require('mime') //导入mime模块,此模块需要从npm下载安装, 浏览器通常使用MIME类型来确定如何处理文档;因此服务器将正确的MIME类型附加到响应对象的头部是非常重要的
② 创建服务器
let server = http.createServer()
③ 服务器处理请求
1) 给服务器注册request事件,只要服务器接收到了客户端的请求,就会触发request事件。
2) request事件有两个参数,request表示请求对象,可以获取所有与请求相关的信息,response是响应对象,可以获取所有与响应相关的信息。
3) 服务器监听的端口范围为:1-65535之间,推荐使用3000以上的端口,因为3000以下的端口一般留给系统使用。
server.on('request', (req, res) => {
// 不管用户访问了什么请求,服务器直接读取对应的文件
fs.readFile(path.join(__dirname, 'pages', req.url), (err, data) => {
if (err) {
//说明资源不存在,设置404状态码,并结束请求
res.writeHead(404, {
'content-type': 'text/html;charset=utf-8'
})
res.end('你访问的页面不存在')
return
}
// 说明资源是存在的
// 需要给每一个响应都设置一个准确的mime类型
// html文件: content-type: 'text/html'
// css 文件 content-type: 'text/css'
// 根据具体的类型 html css jpg动态设置mime类型
res.setHeader('content-type', mime.getType(req.url))
res.end(data)
})
})
④ 启动服务器,设置端口
server.listen(9090, () => {
console.log('服务器启动成功了')
})
3. 完整代码
// 需求: 在浏览器访问对应的页面,服务器找到对应的页面,并返回
// 核心思路:
// 根据用户的请求,找到对应的文件,返回给用户
// 如果文件不存在,给用户响应404即可
// 1.导入模块
const http = require('http')
const path = require('path')
const fs = require('fs')
const mime = require('mime')
// 2.创建服务器
const server = http.createServer()
// 3.服务器处理请求
server.on('request', (req, res) => {
// 找到文件路径
let filePath = path.join(__dirname, 'pages', req.url)
//读取文件
fs.readFile(filePath, (err, data) => {
if (err) {
// 文件不存在,读取失败
res.statusCode = 404
res.setHeader('content-type', 'text/html;charset=utf-8')
res.end('你访问的页面不存在!')
} else {
// 文件存在
res.setHeader('content-type', mime.getType(req.url))
res.end(data)
}
})
})
// 4. 启动服务器
server.listen(9090, () => {
console.log('服务器启动成功了')
})