【前后分离】写一个静态服务器

140 阅读1分钟
  • 全部代码请看我的GitHub项目static server

  • 相当于我们自己写了一个http server

  • 只要加上文件路径就可以在网页中访问该文件

  • 测试文件夹组成如下

  • 新建server.js这就是我们的静态服务器

  • node-dev server.js 8888启动服务器

  • 粗糙的来说:只有content—type和响应体内容会变化,其他不会变化,所以修改他们就行

var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

if(!port){
  console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?')
  process.exit(1)
}

var server = http.createServer(function(request, response){
  var parsedUrl = url.parse(request.url, true)
  var pathWithQuery = request.url 
  var queryString = ''
  if(pathWithQuery.indexOf('?') >= 0){ queryString = pathWithQuery.substring(pathWithQuery.indexOf('?')) }
  var path = parsedUrl.pathname
  var query = parsedUrl.query
  var method = request.method

  /******** 从这里开始看,上面不要看 ************/

  console.log('有个傻子发请求过来啦!路径(带查询参数)为:' + pathWithQuery)

  response.statusCode = 200
  //第一步:确定文件路径
  // 默认首页
  const filePath = path === '/' ? '/index.html' : path
  //第二步:确定文件类型
  const index = filePath.lastIndexOf('.')
  // suffix 是后缀
  const suffix = filePath.substring(index)
  //一一对应所以选哈希表
  const fileTypes = {
    '.html':'text/html',
    '.css':'text/css',
    '.js':'text/javascript',
    '.png':'image/png',
    '.jpg':'image/jpeg'
  }
  //第三步:确定Content-Type
  response.setHeader('Content-Type', 
    `${fileTypes[suffix] || 'text/html'};charset=utf-8`)
  //第四步:确定响应体内容
  let content 
  try{
    content = fs.readFileSync(`./public${filePath}`)
  }catch(error){
    content = '文件不存在'
    response.statusCode = 404
  }
  response.write(content)
  response.end()

  /******** 代码结束,下面不要看 ************/
})

server.listen(port)
console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)