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>")
}