【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)
  }
}
相关推荐
2601_9637713741 分钟前
Hardening Enterprise WordPress Sites Against REST API Leaks and Bad Headers
前端·windows·word·php
蓝银草同学43 分钟前
Stream 实战:博客列表排序、过滤与分页(AI 辅助学习 Java 8)
java·前端·后端
2601_957190901 小时前
飞行影院安装施工指南:场地、动感系统与影片内容配套
大数据·前端·人工智能
爱折腾的小黑牛1 小时前
简记往来批量录入功能的实现:从文本到结构化数据
前端·算法
YHHLAI1 小时前
Agent 智能体开发实战 · 第六课:MCP 协议 —— 让 Agent 跨进程调用工具
前端·人工智能
SmartBoyW1 小时前
前端死磕:一文彻底搞懂 JS 事件循环 (Event Loop) 与宏微任务
前端·javascript
爱勇宝2 小时前
3位工程师靠“删AI代码”创业,一周收费1万美元:以后最贵的能力,可能不是写代码
前端·后端·架构
Curvatureflight2 小时前
客户端日志上报怎么设计?让线上问题不再只靠用户截图
前端·系统架构
不法2 小时前
uniapp map地图导航/地图路线
前端·vue.js·uni-app