nodejs服务器简单封装

1 用app.on()发布请求路径

1.1 定义构造函数app.js

const path = require('path')
const fs = require('fs')

class app {
    constructor() {
        this.serverObj = {}
        this.server = http.createServer()
        this.server.on('request', (req, res) => {
            res.writeHead(200, {
                'content-Type': 'text/html;charset=utf-8'
            });
            let url = req.url
            let urlObj = path.parse(url)
            let dirName = urlObj.dir
            let baseName = urlObj.base
            
   			if (url in this.serverObj) {
                this.serverObj[url](req, res)
            } else {
                res.end("<h1>我是404 not found!</h1>")
            }        
        })
    }
    on(url, fn) {
        this.serverObj[url] = fn
    }
     run(port) {
        this.server.listen(port, () => {
            console.log("服务器正在" + port + "端口运行!http://localhost:3000");
        })
    }
    //导出模块
module.exports = app

1.2 实例化对象index.js

const app = require('./app')
let serverApp = new app()
serverApp.on('/', (req, res) => {
    res.end("<h1>这是首页!</h1>")
})

serverApp.on('/user', (req, res) => {
    res.end("<h1>这是个人主页!</h1>")
})

serverApp.run(3000)

2 正则路径匹配

1.1 appjs中构造函数添加

 constructor() {
        this.serverObj = {}
        his.regObj = {} //添加正则对象
        this.server = http.createServer()
        this.server.on('request', (req, res) => {
            res.writeHead(200, {
                'content-Type': 'text/html;charset=utf-8'
            });
            let url = req.url
            let urlObj = path.parse(url)
            let dirName = urlObj.dir
            let baseName = urlObj.base
			//添加正则匹配
		     for (let key in this.regObj) {
		           let reg = new RegExp(key, 'igs')
		           if (reg.test(url)) {
		               this.regObj[key](req, res)
		               break
		           }
		       }
        
   			if (url in this.serverObj) {
                this.serverObj[url](req, res)
            } else {
                res.end("<h1>我是404 not found!</h1>")
            }        
        })
    }
	

1.2 app.js添加函数

  onReg(url, fn) {
        this.regObj[url] = fn
    }

1.3 index.js里传入正则对象,即可正则匹配路径访问

serverApp.onReg('/abc/\\d', (req, res) => {
    res.end("<h1>这是正则页面!http://localhost:3000/abc/加数字</h1>")
})

3 前端特殊字符渲染匹配替换

3.1 app.js构造函数里添加

 constructor() {
        this.serverObj = {}
        his.regObj = {} //添加正则对象
        this.movies = [] //模拟数据库响应的数据
        this.server = http.createServer()
        this.server.on('request', (req, res) => {
            res.writeHead(200, {
                'content-Type': 'text/html;charset=utf-8'
            });
            let url = req.url
            let urlObj = path.parse(url)
            let dirName = urlObj.dir
            let baseName = urlObj.base
			//添加正则匹配
		     for (let key in this.regObj) {
		           let reg = new RegExp(key, 'igs')
		           if (reg.test(url)) {
		               this.regObj[key](req, res)
		               break
		           }
		       }
        
   			if (url in this.serverObj) {
                this.serverObj[url](req, res)
            }else if (dirName == '/movies') {//渲染处理
                if (Number.parseInt(baseName) < this.movies.length) {
                    fs.readFile('./index.html', {//读index.html页面,进行特殊字符串处理
                        encoding: "utf-8",
                        flag: "r"
                    }, (err, data) => {
                        if (err) {
                            console.log(err);
                            res.end('"<h1>我是404 not found!</h1>"')
                        } else {
                        //当个渲染
                            let result = this.render(data, this.movies[baseName])
                            //列表渲染
                            result = this.renderList(result, this.movies[baseName])
                            res.end(result)
                        }
                    }) 
            else {
                res.end("<h1>我是404 not found!</h1>")
            }        
        })
    }
	

3.2 app.js添加渲染函数

 //渲染单个数据匹配'{{}}'
    render(data, options) {
        let reg = /{{(.*?)}}/igs
        let result
        let dataStr = data

        while (result = reg.exec(dataStr)) {
            let strKey = result[1].trim()
            let strValue = options[strKey]
            dataStr = dataStr.replace(result[0], strValue)

        }
        return dataStr

    }

    //渲染列表,匹配{for xx}{item}{end}
    renderList(data, options) {
        let reg = /{for(.*?)}(.*?){end}/igs
        let result = reg.exec(data)

        let strKey = result[1].trim()
        let strValue = options[strKey]

        let items = result[2]

        let retValue = ''
        strValue.forEach(element => {
            retValue += items.replace('{item}', element)
        });

        let retData = data.replace(result[0], retValue)
        return retData

    }

3.2 index.html渲染页面,把自定义字符串渲染上去

<body>
    <h1>{{movie}}</h1>
    <h3>编剧: {{author}}</h3>
    <h3>主演:{{star}}</h3>
    <p>简介:{{info}}</p>

    <ul>
        {for stars}
        <li>{item}</li>
        {end}
    </ul>
</body>

3.4 index.js里模拟输入的数据

let movies = [{
    movie: '波斯语课 Persischstunden (2020)',
    author: '沃尔夫冈·科尔哈泽 / 伊尔佳·佐芬',
    star: ': 纳威尔·佩雷兹·毕斯卡亚特 ',
    info: '二战期间,犹太人小卷在集中营谎称自己是波斯人保命,被一位德国军官看中要求教自己波斯语。对波斯语完全不懂的小卷只能凭空编出一门语言,他开始用集中营中关押的犹太人的名字作为词根,编造出上千个“波斯语”单词,军官在残暴的环境中对小卷竟有了依赖,并开始袒护他,不料集中营中来了一个真正的波斯人……',
    stars: ['你', '我', '他']
}, {
    movie: '山海情 (2021)',
    author: ' 孔笙 / 孙墨龙',
    star: ': 黄轩 / 张嘉益 / 闫妮 / 黄觉 / 姚晨',
    info: ' 上世纪90年代,从宁夏贫瘠甲天下的西海固地区搬迁到玉泉营地区的移民们,从无到有地建设着他们的新家园,村干部马得福(黄轩 饰)操心着通电、灌溉用水等桩桩件件的问题,他足够努力,却不自信未来什么时候来。直到国家新的扶贫政策出台,福建对宁夏的扶贫事业进行对口援助,并建立了合作样板闽宁村,陈金山(郭京飞 饰)、凌一农(黄觉 饰)等一批优秀的福建干部、技术人员为闽宁镇洒下奋斗的汗水,帮助得福找到了未来的方向,白麦苗(黄尧 饰)、马得宝(白宇帆 饰)、李水花(热依扎 饰)等村里的年轻人也通过劳务输入、发展庭院经济等收获了自信。在发展的过程中,传统与现代,物质文明与精神文明,寻根与断根等问题不断突显,对于马喊水(张嘉益 饰)、白校长(祖峰 饰)、李大有(尤勇智 饰)这些上一辈的人们而言,挑战和转变也在不断发生着。从西海固走出的人们没有忘记他们的初心,他们没有断根,',
    stars: ['黄轩', '张嘉益', '闫妮']
}]

serverApp.movies = movies//放入app的movies数组里

3.5 渲染替换成功
在这里插入图片描述

ps:跟着教程写的,新手写一遍加深对服务器封装的理解。
里面定义的serverObj 对象,然后定义on()函数,把URL和响应函数传进去,最后利用监听request来调用响应函数,同时传入请求和响应对象的写法很有意思 。 end.....

  this.serverObj = {}
  //传值
  on(url, fn) {
        this.serverObj[url] = fn
    }
    //监听调用
    if (url in this.serverObj) {
                this.serverObj[url](req, res)
            } else {
                res.end("<h1>我是404 not found!</h1>")
            }   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值