框架 || express 中间件的设计

express 中间件

1 普通路由

  • 先写个普通路由,能够根据不同的路径访问不同的文件

    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    
    const server =  http.createServer (function (req, res) {
    
        res.writeHead(200)
        res.end(fs.readFileSync(path.join(__dirname, 'public', req.url)))
    
    })
    
    server.listen(8001)
    

    这样写实现了我们的功能,但是有个缺陷, 如果找不到文件,怎么办? 此时应该执行其他的逻辑,比如匹配api路由,假设我们要分别匹配文件路由和api路由

    此时我们的逻辑是

    1. fs读目录,判断是否有匹配上文件,如果没有的话放行
    2. 执行api判断,没有的话放行
    3. 如果文件路由和api路由都没匹配上,返回404

1.1 文件路由

  • 先做第一步,判断是否文件能够匹配,我搜了下读文件的api发现了readdir,就按照最简单的逻辑写了一个判断有没有文件的

    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    
    const mime = require('mime-types')
    
    const server =  http.createServer (function (req, res) {
        fs.readdir('public', function(error, files) {
            files.forEach((file) => {
                if(req.url.slice(1, req.url.length) === file) {
                    res.writeHead(200, mime.lookup(req.url.split('.')[1]))
                    res.end(fs.readFileSync(path.join(__dirname, 'public', req.url)))
                }
            })
        })
    })
    
    server.listen(8001)
    

    **缺陷:**目录是个树形的结构,这样显然不能遍历到全部的文件

  • 解决以上问题,并且简单加入重定向

    const http = require('http')
    const fs = require('fs')
    const path = require('path')
    
    const mime = require('mime-types')
    //需要下载mime-type的npm包
    
    function getFile(dir, pathname) {
        try{
            return fs.readFileSync(path.join(__dirname, dir, pathname))
        } catch(e) {
            return null
        }
    }
    
    const server =  http.createServer (function (req, res) {
    
        if(req.url === '/') {
            res.setHeader('Location', 'index.html')
            res.writeHead(301)
            res.end()
            return
        }
    
        const file = getFile('public', req.url)
        if(file) {
            res.setHeader('Content-Type', mime.lookup(req.url))
            res.writeHead(200)
            res.end(file)
        } else {
            res.writeHead(404)
            res.end()
        }
    })
    
    server.listen(8003)
    

1.2 api路由

目标是写一个用户登录的接口

  • 先写个简单的ui

        <form action="/login" method="POST">
            <input name="name"  placeholder="请输入用户名">
            <input name="password" type="password" placeholder="请输入密码">
            <input type="submit" value="登陆">
        </form>
    
  • 现在要获取请求的参数了,这里是post请求,数据在请求体里,并且如果文件过大,那么数据会分组传输,如果数据过大,可能请求行和请求头服务端先受到了,就会执行回调函数,但是数据还没有接收完,这种情况能发挥node异步的优势。

        let data = ''
        //监听接收数据的事件,收到数据后把数据拼接起来
        req.on('data', function(chunk) {
            data += chunk
        })
        //end事件说明事件好了,打印下
        req.on('end', function() {
            console.log(data)
        })
    
    

    成功拿到请求体

    但是如果这样写能拿到data

    答案是不能, 因为异步,但是由于我还不会promise、async、await之类的方法,所以只能用笨方法写了,那就是回调地狱!!

    <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值