三、原生node开发Web服务器

79 阅读2分钟

相关code仓库

image.png

1.Node核心模块 http

  • 使用node 创建一个http服务器,并且可以接收到客户端发来的请求
  • 获取到客户端具体的请求数据,并根据不同的请求数据进行处理
  • 将处理之后的结果,响应回客户端,并断开本次连接

运行js文件时可以安装 nodemon 来进行实时的更改实现自动刷新

image.png

  • 命令行执行 npm i -g nodemon
// 1. 导入http模块
var http = require('http');

// 2. 创建服务器
// 获取到服务器的实例对象
var server = http.createServer();
server.listen(2000, () => {
    console.log('http://127.0.0.1:2000');
})


// 3. 监听客户端的事件
// req 请求信息
// res 响应的信息
server.on('request', (req, res) => {
    console.log('request 接收到了');
    res.write('你好')
    res.end()
})

2.服务器数据响应不同类型处理

image.png

  • 简易版
server.on('request', (req, res) => {
    // console.log('request 接收到了');
    // res.setHeader('Content-Type', 'application/json');
    // res.setHeader('Content-Type', 'text/html; charset=utf-8');  // html
    // res.setHeader('Content-Type', 'text/plain; charset=utf-8');  // 纯文本
    // res.write('<h1>你好</h1>')
    if (req.url == './') {
        fs.readFile('./index.html', 'utf-8', (err, data) => {
            res.write(data)
            res.end();
        })
    } else {
        fs.readFile('./个人项目介绍.png', (err, data) => {
            res.end(data)
        });
    }
    
    // res.end()
})

3.处理客户端不同的请求方法

image.png

  • GET 参数处理
var http = require('http');
var fs = require('fs');
var url = require('url');
var server = http.createServer();
server.listen(2000, () => {
    console.log('http://127.0.0.1:2000');
})

function log(value, string) {
    console.log(value, string);
}

// http://127.0.0.1:2000/user?id=222&name=zhangsan
server.on('request', (req, res) => {
    if (req.method === 'GET') {
        const { id, name }  = url.parse(req.url, true).query
        log(id, '===id===')
        log(name, '===name===')
        if (req.url == './') {
            fs.readFile('./index.html', 'utf-8', (err, data) => {
                res.write(data)
                res.end();
            })
        } else {
            fs.readFile('./demo.png', (err, data) => {
                res.end(data)
            });
        }
    } else if (req.method === 'POST') {
        
    }
})
  • POST 参数处理
<form action="./" alt="">
    <input type="text" name="name"/>
    <input type="text" name="age"/>
    <input type="submit" value="提交POST"/>    
</form>


server.on('request', (req, res) => {
    if (req.method === 'GET') {
        const { id, name }  = url.parse(req.url, true).query        
        if (req.url == './') {
            fs.readFile('./index.html', 'utf-8', (err, data) => {
                res.write(data)
                res.end();
            })
        } else {
            fs.readFile('./demo.png', (err, data) => {
                res.end(data)
            });
        }
    } else if (req.method === 'POST') {
        var str = ''
        req.on('data', (data) => {
            str += data
            console.log(str, '===data===');
        })
        req.on('end', () => {
            // 通过querystring 来解析流数据信息
            log(require('querystring').parse(str))
        })
        res.end()
    }
})

4.对服务器代码进行模块化拆分

  • server 服务层
var http = require('http');
var router = require('./router')
var server = http.createServer();
server.listen(2000, () => {
    console.log('http://127.0.0.1:2000');
})
server.on('request', (req, res) => {
    router(req, res)
})
  • router 请求管理层
var fs = require('fs');
var url = require('url');
var controaller = require('./comtroller')
module.exports = (req, res) => {
    if (req.method == 'GET') {
        const { id, name }  = url.parse(req.url, true).query        
        if (req.url == '/') {
            controaller.index(res)
        } else {
            fs.readFile('./demo.png', (err, data) => {
                res.end(data)
            });
        }
    } else if (req.method == 'POST') {
        var str = ''
        req.on('data', (data) => {
            str += data
            console.log(str, '===data===');
        })
        req.on('end', () => {
            // 通过querystring 来解析流数据信息
            controaller.user(require('querystring').parse(str), res)
        })
        res.end()
    }
}
  • controller 逻辑控制层
var fs = require('fs');
module.exports = {
    index(res) {
        fs.readFile('./index.html', 'utf-8', (err, data) => {
            res.write(data)
            res.end();
        })
    },
    user(paramsData, res) {
        // 业务逻辑代码
        console.log(paramsData, '===data===');
        console.log(res, '==res==');
    }
}