原生Web Server的实战

1、Web Server的构成

2、Nodejs作为Web Server的优势

3、Web Server最小系统

 Web Server的构成 

处理HTTP 对HTTP的动词(get、post、put)进行响应
路由管理 分别处理不同URL路径的请求,返回对应的网络资源
静态文件托管 对网络请求的静态资源进行响应或使用动态模板响应请求
文件数据存储 将请求携带的数据存储到文件或者数据库中

Web Server的基本架构

  服务器和数据库中间增加其他的服务,

 Nodejs作为Web Server的优势 

1、并发性能优异 基于事件驱动的服务在响应请求的场景中有极高的并发性能表现
2、js同构 减少学习成本,使用最流行的js或者其他可编译/转换为js的语言均可实现
3、生态活跃完善 npm提供了数十万个可重用的工具包,还挺乖了一六的依赖解决方案,可实现自动化工具链构建
4、代码可移植 兼容各种操作系统运行环境,一份代码可以运行在多种环境中
5、框架高度包容 Node及Node的Web框架都拥有天然的包容性,易于拓展和维护
6、友好的社区氛围 丰富的生态诞生了大量的开源社区,聚集了众多优秀的开发人员

Web Server最小系统 

  nodemon 用来监控 node.js 源代码的变化和自动重启服务器 (npm 安装)

  HTTPie 用于与 HTTP 服务器做测试、调试和常规交互

const http = require(‘http‘)
const url = require(‘url‘)
const path = require(‘path‘)
const fs = require(‘fs‘)
const qs = require(‘querystring‘)

const notFound = (req, res) => {
  fs.readFile(path.join(__dirname, ‘404.html‘), (err, data) => {
    if(err) {
      res.write(404, ‘not found‘)
    }else {
      res.writeHead(404, {‘Content-type‘: "text/html;charset=‘utf-8‘"})
      res.write(data)
      res.end()
    }
  })
}
const writeDb = (chunk) => {
  fs.appendFile(path.join(__dirname, ‘db‘), chunk, err => {
    if(err) throw err
    console.log(‘db insert...‘, chunk && chunk.toString())
  })
}

http.createServer((req, res) => {
  // 1、路由处理
  // 2、静态资源托管
  // 3、HTTP verb
  // 4、持久化数据 store
  let pathName = url.parse(req.url).pathname // 路径解析

  // /api => 接口
  if(pathName.startsWith(‘/api‘)) {
    const method = req.method
    if(method === ‘GET‘) {  
      const query = qs.parse(url.parse(req.url).query) //?a=1&b=2
      const resData = {
        code: 200,
        msg: ‘success‘,
        data: query
      }
      res.end(JSON.stringify(resData))
      return
    }
    if(method === ‘POST‘) { // HTTPie
      const contentType = req.headers(‘content-type‘)
      if (contentType === ‘application/json‘) {
        let postData = ‘‘
        req.on(‘data‘, chunk => {
          postData +=  chunk
          writeDb(postData)
        })
        req.on(‘end‘, () => {
          res.end(postData)
        })
      }
    }
  }

  if(pathName === ‘/‘) {
    pathName = path.join(__dirname, ‘index.html‘)
  }
  const extName = path.extname(pathName)  // 取后缀名

  if(extName === ‘.html‘) {
    // index.html 文件读取模块
    fs.readFile(pathName, (err, data) => { // data为Buffer
      if(err) {
        // 404
        notFound(req, res)
      }else {
        res.writeHead(200, {‘Content-Type‘: "text/html;charset=‘utf-8‘"})
        res.write(data)
        res.end()
      }
    })
  }

  // res.write(‘hello Nodejs 1‘)
  // res.end()
}).listen(8080)

// 改变内容需要频繁启动 引入第三方插件 nodemon 监听代码变更 npm安装

 

原生Web Server的实战

上一篇:css 语法记录


下一篇:webpack按需加载