【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)
  }
}
相关推荐
枣把儿2 分钟前
Vercel 收购 NuxtLabs!Nuxt UI Pro 即将免费!
前端·vue.js·nuxt.js
望获linux3 分钟前
【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed
linux·运维·服务器·开发语言·前端·操作系统·嵌入式软件
爱编程的喵5 分钟前
从XMLHttpRequest到Fetch:前端异步请求的演进之路
前端·javascript
喜欢吃豆7 分钟前
深入企业内部的MCP知识(三):FastMCP工具转换(Tool Transformation)全解析:从适配到增强的工具进化指南
java·前端·人工智能·大模型·github·mcp
豆苗学前端11 分钟前
手把手实现支持百万级数据量、高可用和可扩展性的穿梭框组件
前端·javascript·面试
不见_11 分钟前
不想再写周报了?来看看这个吧!
前端·命令行
yinke小琪13 分钟前
JavaScript 事件冒泡与事件捕获
前端·javascript
pany14 分钟前
写代码的节奏,正在被 AI 改写
前端·人工智能·aigc
liliangrong77717 分钟前
ES2025新特性详解
前端
gzzeason25 分钟前
Ajax:现代JS发起http通信的代名词
前端·javascript·ajax