node中提供了一些核心模块,基于这些模块可以在服务器端进行一些操作
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下载