node中提供了一些核心模块,基于这些模块可以在服务器端进行一些操作
fs模块
fs是node提供的一个核心模块,可以用来读取文件,现有一个需求,要把同目录下的test中org.txt中数据进行处理,并且在test文件夹下新建一个名为student.txt的目录来保存处理好的数据
处理前的数据
小明=100 小红=90 小刚=80 小彭=70
处理后的数据
小明:100
小红:90
小刚:80
小彭:70
// 1.创建文件方法
const fs=require('fs');
fs.readFile('./test/og.txt','utf8',function(err,data){
// 如果读取失败直接退出函数
if(err){
return err;
}
// 1.读取文件内容
// 2.修改文件内容
// replace用普通字符替换只会执行一次,用正则的全局匹配来替换
let reg=/=/g;
let reg2=/ /g;
let new_data=data.replace(reg,':');
// 再次替换空格为换行符\r\n
let final_data=new_data.replace(reg2,'\r\n')
//将最终处理好的字符写入到test目录下,新建一个文本保存
fs.writeFile('./test/student.txt',final_data,'utf8',err=>{});
})
代码实现如上,下面是是几个需要注意的地方
1.读取文件内容fs.readFile
传入三个参数,第一个是读取文件的路径,第二个是设置读取的编码格式,选填,第三个是一个回调函数,有两个参数,第一个是错误对象,第二个是读取到的数据
2.写入文件内容fs.writeFile
传入四个参数,第一个是写入内容的路径,第二个是写入的内容,第三个是写入的编码格式,默认为utf8,第四个是回调函数,传一个错误对象参数
字符串的替换
字符串替换用的是replace方法,传入两个参数,第一个是要替换的内容,可以是正则也可以是一个字符串,第二个是替换为的字符,如果第一个参数用的是字符串只会执行一次替换,所以这里用的是正则的全局替换,并且replace会返回一个替换后的新字符串,原字符串不会受影响,需要用一个字符串接收
搭建一个简单的服务器
const http=require('http')
const path=require('path')
const fs=require('fs')
const url=require('url')
const template=require('art-template')
const server=http.createServer()
const arr_list=[];
server.on('request',(req,res)=>{
// 将所有public中的文件暴露出去,给所有的路径都拼接一个public字符串
if(url.parse(req.url,true).pathname=='/handle'){
// res.end(url.parse(req.url,true).query)
let str=url.parse(req.url,true).query;
str=JSON.stringify(str);
str=JSON.parse(str);
// str.data='2022.2.3'
arr_list.push(str)
console.log(arr_list);
// 重定向
res.statusCode=302
res.setHeader('Location','/');
res.end();
// res.end(str);
}
if(req.url=='/'){
req.url='/index.html'
}
let req_url='public'+req.url
fs.readFile(req_url,'utf8',function(err,data){
// 当访问的页面是index.html时进行模板引擎渲染
if(req_url=='public/index.html'){
let li_moudle=['<li>123</li>']
for(i=0;i<arr_list.length;i++){
li_moudle.push(`<li>${arr_list[i].txt}</li>`);
console.log(li_moudle);
}
data=data.toString()
data=template.render(data,{
lists:li_moudle
})
// 这里是普通的replace方法替换
// data=data.replace('^_^',li_moudle);
// console.log(li_moudle);
}
if(err){
return res.end('404 not found')
}
res.end(data);
})
});
server.listen(3000,()=>{
console.log('服务器运行中,127.0.0.1:3000');
})
实现思路
上面的代码就是用node几个核心模块搭建的一个最简单的服务器,一共有两个页面,一个是首页评论页面,一个是写评论页面,js文件在运行时会有一个数组存放评论数据,每次当用户增加评论时,都会把提交的数据通过push()方法添加到数组中,提交完成后会重定向到首页,首页每次刷新时候都会通过模板引擎重新渲染
1.打开服务器
创建一个server对象,并且监听3000端口
nodemon
这里安装了一个nodemon,用nodemon打开服务器可以在代码改变时候服务器同步刷新
2.暴露可以被用户访问到的文件
在收到客户端访问时,动态的给访问路径前拼接一个public路径,然后打开访问路径,这样就只能访问到public目录下的所有资源了
url.parse
url.parse可以解析访问网址,并且解析出get请求数据,但是由于新版的node不再使用该方法,所以会出现一些错误,可以用JSON转换一次
let str=url.parse(req.url,true).query;
str=JSON.stringify(str);
str=JSON.parse(str);
3.重定向
这里重定向用的是302状态码
res.statusCode=302
res.setHeader('Location','/');
res.end();
4.模板引擎渲染
这里模板引擎渲染采用art-template模块,这是第三方模块,需要npm下载