使用npm手写服务器

113 阅读2分钟

1.手写服务器

// 导入http模块
const http=require('http')
// 创建服务器
const app=http.createServer()
/* 
  监听客户端的请求
  req 客户端的请求对象
  res 服务器的响应对象
*/
app.on('request',(res,req)=>{  //on方法在后面也会多次用到,目前可以看成一个开启监听的api
  console.log('有人访问了我的服务器')
  req.end('hello node')
})
/* 
  调配监听端口服务
  port 端口号
  host 设置ip地址,不设置或者写'localhost'均为主机地址,学习阶段一般不设置
  callback 回调函数 
*/
app.listen(3000,()=>{
  console.log('http://127.0.0.1:3000')
})

2.请求分为get请求和post请求

get请求不能传输数据 post请求专门用来传输数据 在设置请求时,在每次请求后都要调用end方法或者send方法来终止一次请求,因为http是无连接的,每一次会话都要进行一次终止.

3.根据不同的请求发送不同的资源

主要思路是根据两种请求中req的url属性的不同来判断,给与不同的资源.这是手写时的思路

const fs = require('fs')
const path = require('path')
const http = require('http')
const app = http.createServer()
app.on('request', (req, res) => {  //通过on监听请求
  if (req.url === '/index.html') {
    fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
      if (err) return console.log(err.message)
      res.end(data)
    })
  } else if (req.url === '/about.html') {
    fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
      if (err) return console.log(err.message)
      res.end(data)
    })
  } else if (req.url === '/2.webp') {
    fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
      if (err) return console.log(err.message)
      res.end(data)
    })
  } else if (req.url === '/api/post' && req.method === 'POST') {
    res.end('post')
  } else {
    res.end('404')
  }
})
app.listen(5000, ['127.0.0.1'], () => {
  console.log('本地服务:http://127.0.0.1:5000')
})

手动进行静态资源托管

手写的思路:通过node的fs模块的读取文件方法结合req的url路径去锁定目标文件

const fs = require('fs')
const path = require('path')
const http = require('http')
const app = http.createServer()

app.on('request', (req, res) => {
  getStaticFile(req, res)
})
app.listen(5000, ['127.0.0.1'], () => {
  console.log('本地服务:http://127.0.0.1:5000')
})

// 封装静态资源托管
function getStaticFile(req, res) { //读取views文件夹下目标url路径的文件数据,再通过end传输给客户端
  fs.readFile(path.join(__dirname, './views', req.url), (err, data) => {
    if (err) return console.log(err.message)
    res.end(data)
  })
}

手写中间件以了解中间件的运行原理

中间件需要在服务器的use方法上'激活'--也可以理解为use启动了中间件的监听,这样每次访问数据时都会运行中间件的算法.

具体代码内容在index手写中间件.js文件中

node的express模块也同样内置了中间件的使用方法

// app为自己手写的服务器,urlencodee可以监听请求中传输的为对象的数据.
app.use(express.urlencoded({ extended: false }))
// json用来监听请求中传输的字符串数据
app.use(express.json())

对一些node方法的理解

事件触发器,在node的event模块中内置了EventEmitter对象,该对象有两个公开的方法on和emit,emit还没学,先讲讲on,它们都是用来监听事件的,目前使用过的事件有,data(当传输数据时触发),end(在请求会话结束的事件)

use方法,目前理解为类似事件的监听开启器.