【Node.js工程师养成计划】之原生node开发web服务器

一、使用node创建http服务器

javascript 复制代码
var http = require('http');

// 获取到服务器实例对象
var server = http.createServer()
server.listen(8080, function() {
   console.log('http://127.0.0.1:8080');
})

server.on('request', function(req, res){
   console.log('request');
   res.write('66666666888') // 响应数据
   res.end() // 断开服务器
})

二、服务器响应不同数据类型

javascript 复制代码
var http = require('http');

// 获取到服务器实例对象
var server = http.createServer()
server.listen(8080, function() {
   console.log('http://127.0.0.1:8080');
})

server.on('request', function(req, res){
   console.log('request');
   res.setHeader('Content-type', 'text/plain;charset=utf-8')
   res.write('你好')
   res.end() // 断开服务器
})
javascript 复制代码
var http = require('http');

// 获取到服务器实例对象
var server = http.createServer()
server.listen(8080, function() {
   console.log('http://127.0.0.1:8080');
})

server.on('request', function(req, res){
   console.log('request');
   // res.setHeader('Content-type', 'text/plain;charset=utf-8')
   res.setHeader('Content-type', 'text/html;charset=utf-8')
   res.write('<h1>你好</h1>')
   res.end() // 断开服务器
})
javascript 复制代码
var http = require('http');
var fs = require('fs')

// 获取到服务器实例对象
var server = http.createServer()
server.listen(8080, function() {
   console.log('http://127.0.0.1:8080');
})

server.on('request', function(req, res){
   if (req.url == '/') {
      fs.readFile('./index.html', 'utf-8', function(err, data){
         res.write(data)
         res.end()
      })
   } else {
      fs.readFile('./aa.jpg', function(err, data){
         res.end(data)
      })
   }
   
})

三、http不同请求方法处理

javascript 复制代码
var http = require('http');
var fs = require('fs')
var url = require('url')

// 获取到服务器实例对象
var server = http.createServer()
server.listen(8080, function() {
   console.log('http://127.0.0.1:8080');
})

server.on('request', function(req, res){
   console.log(11,req.method)
   if (req.method === 'GET') {
      console.log(url.parse(req.url, true).query.id)
      if (req.url == '/') {
         fs.readFile('./index.html', 'utf-8', function(err, data){
            res.write(data)
            res.end()
         })
      } else {
         fs.readFile('./aa.jpg', function(err, data){
            res.end(data)
         })
      }
   } else if (req.method === 'POST') {

   }
})

四、接收处理post消息数据

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>你好啊 zm</h1>
  <img src="./aa.jpg" alt="" width="50" height="50">

  <div>
    <form action="./" method="post">
      <input type="text" name="username"> <br>
      <input type="text" name="age">
      <input type="submit" value="post提交">
    </form>
  </div>
</body>
</html>
javascript 复制代码
var http = require('http');
var fs = require('fs')
// var url = require('url')

// 获取到服务器实例对象
var server = http.createServer()
server.listen(8080, function() {
   console.log('http://127.0.0.1:8080');
})

server.on('request', function(req, res){
   console.log('method:',req.method)
   if (req.method === 'GET') {
      // console.log(url.parse(req.url, true).query.id)
      if (req.url == '/') {
         fs.readFile('./index.html', 'utf-8', function(err, data){
            res.write(data)
            res.end()
         })
      } else {
         fs.readFile('./aa.jpg', function(err, data){
            res.end(data)
         })
      }
   } else if (req.method === 'POST') {
      // 请求体中
      var data = ''
      req.on('data', function(d){
         data+=d
         console.log(d)
      })
      req.on('end', function(){
         console.log(require('querystring').parse(data))
      })
   }
})

五、服务器代码模块拆分

server.js

javascript 复制代码
var http = require('http');
var fs = require('fs')
// var url = require('url')
var router = require('./router')

// 获取到服务器实例对象
var server = http.createServer()
server.listen(8080, function() {
   console.log('http://127.0.0.1:8080');
})

server.on('request', function(req, res){
   // console.log('request');
   // // res.setHeader('Content-type', 'text/plain;charset=utf-8')
   // res.setHeader('Content-type', 'text/html;charset=utf-8')
   // res.write('<h1>你好</h1>')
   // res.end() // 断开服务器

   console.log('method:',req.method)
   router(req, res)
})

router.js

javascript 复制代码
var fs = require('fs')
var controller = require('./controller')

module.exports = (req, res) => {
  if (req.method === 'GET') {
    // console.log(url.parse(req.url, true).query.id)
    if (req.url == '/') {
      controller.index(res)
    } else {
       fs.readFile('./aa.jpg', function(err, data){
          res.end(data)
       })
    }
 } else if (req.method === 'POST') {
    // 请求体中
    var data = ''
    req.on('data', function(d){
       data+=d
       console.log(d)
    })
    req.on('end', function(){
       controller.user(require('querystring').parse(data))
    })
 }
}

controller.js

javascript 复制代码
var fs = require('fs')

module.exports = {
  index(res){
    fs.readFile('./index.html', 'utf-8', function(err, data){
      res.write(data)
      res.end()
    })
  },

  user(postData, res){
    // 业务逻辑代码
    console.log(postData)
  }
}
相关推荐
熬夜苦读学习5 分钟前
Linux文件系统
linux·运维·服务器·开发语言·后端
祈澈菇凉10 分钟前
如何结合使用thread-loader和cache-loader以获得最佳效果?
前端
垣宇13 分钟前
Vite 和 Webpack 的区别和选择
前端·webpack·node.js
java1234_小锋17 分钟前
一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密
前端·python·flask·flask3
化作繁星20 分钟前
如何在 React 中测试高阶组件?
前端·javascript·react.js
荔枝荷包蛋66625 分钟前
【网络】高级IO——Reactor版TCP服务器
运维·服务器
Au_ust27 分钟前
千峰React:函数组件使用(2)
前端·javascript·react.js
爱吃南瓜的北瓜37 分钟前
npm install 卡在“sill idealTree buildDeps“
前端·npm·node.js
TTc_41 分钟前
记录首次安装远古时代所需的运行环境成功npm install --save-dev node-sass
前端·npm·sass
翻滚吧键盘1 小时前
npm使用了代理,但是代理软件已经关闭导致创建失败
前端·npm·node.js