nodejs 原生路由GET、POST请求和静态资源处理

浏览器客户端请求的 不同URL 和其他需要的 GET 及 POST 参数,路由需要根据这些数据来执行相应的代码

简单的模块化服务器和路由

浏览器请求服务器 → app → server → router → handle → response返回到浏览器 

app.js文件

var server = require("./server")
//匹配路由
var route = require("./router")
//所有路由函数
var handler = require("./handle")

var handle = {}
//设置不同url执行不同路由函数
handle['/'] = handler.home
handle['/home'] = handler.home
handle['/list'] = handler.list
handle['/api/josn'] = handler.apiJson

server.startServer(route,handle)

server.js文件

let http = require("http")
//let fs = require("fs")



function startServer(route,handle){
    //创建web服务器   request和response都是流的实例
    var server = http.createServer(function(request,response){
        
        //执行路由传入 路由方法函数 请求的地址 服务器返回值response
        route(handle,request.url,response)

        // if(request.url == '/' || request.url == '/home'){
        //     //设置响应头
        //     response.writeHead(200, { 'Content-Type': 'text/html' });
        //     //创建读取流                           //通过管道写入到response 传输到浏览器
        //     fs.createReadStream(__dirname +'/index.html','utf8').pipe(response)
        // }else if(request.url == '/list'){
        //     response.writeHead(200, { 'Content-Type': 'text/html' });
        //     //创建读取流                           //通过管道写入到response 传输到浏览器
        //     fs.createReadStream(__dirname +'/list.html','utf8').pipe(response)
        // }else if(request.url == '/api/json'){
        //     response.writeHead(200, { 'Content-Type': 'application/json' });
        //     var jsonObj = {
        //         name: "小明"
        //     };
        //     response.end(JSON.stringify(jsonObj));
        // }else{
        //     response.writeHead(404, { 'Content-Type': 'text/html' });
        //     //创建读取流                            //通过管道写入到response 传输到浏览器
        //     fs.createReadStream(__dirname +'/404.html','utf8').pipe(response)
        // }

    })

    //监听在端口8888
    server.listen(8888,'127.0.0.1')

    console.log('服务启动端口8888')
}

exports.startServer = startServer

router.js文件

var fs = require("fs")
var route = function(handle,url,response){
    // console.log(url)

    //通过url匹配执行对应方法函数
    if(typeof handle[url] == 'function'){
        handle[url](response)
    }else{
        response.writeHead(404,{ 'Content-Type' : 'text/html' })
        fs.createReadStream(__dirname  + '/404.html','utf8').pipe(response)
    }

}

module.exports = route

handle.js文件

var fs = require("fs")

// 所有路由方法函数

function home(response){
    console.log('home')
    response.writeHead(200,{'Content-Type':'text/html'})
    fs.createReadStream(__dirname+'/index.html','utf8').pipe(response)
}
function list(response){
    console.log('list')
    response.writeHead(200,{'Content-Type':'text/html'})
    fs.createReadStream(__dirname+'/list.html','utf8').pipe(response)
}

function apiJson(response){
    console.log('json')

    var json = {
        name:'小明',
        age:12
    }

    response.writeHead(200,{'Content-Type':'application/json'})
    response.write(JSON.stringify(json))
    response.end()
}

module.exports = {
    home:home,
    list:list,
    apiJson:apiJson
}

修改代码 判断GET和POST请求

server.js文件

var http = require("http")
var fs = require("fs")
// var url = require("url")//已废弃 获取url路径部分 用new URL() 类替代
var querystring = require("querystring")
//处理静态资源
var staticFile = require("./stiticFile")



function startServer(route,handle){
    //创建web服务器   request和response都是流的实例
    var server = http.createServer(function(request,response){
        // console.log(request.url)

        //静态资源 .css .js .jpg 等文件需要单独处理
        if(staticFile(request,response)){
            return false
        }
                        //获取和设置网址的路径部分
        var pathname = new URL(request.url,'http://locathost:8888').pathname
        console.log("路径:"+ pathname )
        
        var data = ""
        request.on("error",function(err){
            console.error(err)

        }).on("data",function(chunk){
            data +=chunk

        }).on("end",function(){

            //POST请求 监听请求流的data事件拼接数据 再把数据传参到路由做处理
            if(request.method == "POST"){

                //执行路由传入 路由方法函数 请求的地址 服务器返回值response
                route(handle,pathname,response,querystring.parse(data))

            }else{//GET请求 通过url获取数据 再把数据传参到路由做处理

                var params = new URL(request.url,'http://locathost:8888').search
                params = params.slice(1,params.length)
                console.log(JSON.stringify(querystring.parse(params)))
                //执行路由传入 路由方法函数 请求的地址 服务器返回值response
                route(handle,pathname,response,querystring.parse(params))

            }
        })
        

    })

    //监听在端口8888
    server.listen(8888,'127.0.0.1')

    console.log('服务启动端口8888')
}

exports.startServer = startServer

staticFile.js文件

处理静态资源 .css .js .jpg 等文件请求需要单独处理

var fs = require("fs")

function staticFile(req,res){
    // console.log(req)

    var staticType = req.url.split('.')[req.url.split('.').length - 1]
    if(staticType == 'css'){
        res.writeHead(200,{'Content-Type' : 'text/css'})
        fs.createReadStream(__dirname + req.url,'utf8').pipe(res)
        return true
    }
    if(staticType == 'js'){
        res.writeHead(200,{'Content-Type' : 'text/js'})
        fs.createReadStream(__dirname + req.url,'utf8').pipe(res)
        return true
    }
    
    if(['gif', 'jpeg', 'jpg', 'png'].includes(staticType)){
        console.log("图片路径" +__dirname + req.url)
        res.writeHead(200,{'Content-Type' : 'image/' + staticType})
        fs.createReadStream(__dirname + req.url).pipe(res)
        return true
    }
    return false

}

module.exports = staticFile

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuhang139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值