欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

node模拟一个简单的服务器

程序员文章站 2022-05-09 08:09:23
...

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('服务器启动成功了')
})

注: 转载需引用