node静态服务器实现静态读取文件或文件夹
现在我们已经大致了解了node的基本工作原理,现在来实现一个系统的功能读取文件或者文件夹
采坑记录
中文输出乱码问题
res.statusCode=200 res.setHeader('Content-Type','text/plain') res.end('啊啊和嘎哈啊')
输出中出现中文乱码附解决方案~
res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'})
或
res.writeHead(200,{'Context-Type':'text/plain'}) res.write('')
文件读取方式
node允许通过两种方式读取并输出文件
one:以文件流的形式读取与返回一起进行,快=推荐
fs.createReadStream(filePath).pipe(res)
two:先将文件整个读取,然后将文件内容一起返回,简单说这就是api的蹩脚使用=慢
fs.readFile(filePath,(err,data)=>{ if(err)return res.end(data) })
读取文件或者文件夹
废话不说,上代码
require('./config/defaultConfig')更新为以下
module.exports={ //主机名称 hostname:'127.0.0.1', //端口号 port:6969, //当前文件夹 root:process.cwd() }
//引入http内置模块 consthttp=require('http') //引入chalk用于美化后台打印 constchalk=require('chalk') constpath=require('path') constfs=require('fs') //引入基本配置 constconf=require('./config/defaultConfig') //创建一个server实例 constserver=http.createServer((rep,res)=>{ //拿到路径 constfilePath=path.join(conf.root,rep.url) //判断是否为文件或者文件夹 fs.stat(filePath,(err,stats)=>{ //设置公共头部信息 res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'}) if(err){ //状态码 res.statusCode=404 //找不到提示文本 res.end(`${filePath}is404`) return } if(stats.isFile()){ //如果是文件返回文件内容 res.statusCode=200 fs.createReadStream(filePath).pipe(res) }elseif(stats.isDirectory()){ //如果是文件夹,返回文件列表 fs.readdir(filePath,(err,files)=>{ if(err)return res.statusCode=200 res.end(files.join(',')) }) } }) }) //监听server实例 server.listen(conf.port,conf.hostname,()=>{ constaddr=`http://${conf.hostname}:${conf.port}` console.info(`serverstartdat${chalk.green(addr)}`) })
代码优化
上述代码存在很多回调,代码臃肿可读性差。下面利用异步将回调去除,达到优化效果
require-atomic-updates注意eslint对于此项的限制,为此将实参await
constfs=require('fs') constpromisify=require('util').promisify conststat=promisify(fs.stat) constreaddir=promisify(fs.readdir) module.exports=asyncfunction(rep,res,filePath){ //规避此问题require-atomic-updates报告在异步函数中重新分配变量时可能发生的竞争条件错误 constawaitRes=awaitres awaitRes.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'}) try{ conststats=awaitstat(filePath) if(stats.isFile()){ //如果是文件返回文件内容 awaitRes.statusCode=200 fs.createReadStream(filePath).pipe(awaitRes) }elseif(stats.isDirectory()){ //如果是文件夹,返回文件列表 constfile=readdir(filePath) awaitRes.statusCode=200 awaitRes.end(file.join(',')) } }catch(ex){ //状态码 awaitRes.statusCode=404 //找不到提示文本 awaitRes.end(`${filePath}is404`) } }
app.js文件变更为
//引入http内置模块 consthttp=require('http') //引入chalk用于美化后台打印 constchalk=require('chalk') constpath=require('path') constroute=require('./header/route') //引入基本配置 constconf=require('./config/defaultConfig') //创建一个server实例 constserver=http.createServer((rep,res)=>{ //拿到路径 constfilePath=path.join(conf.root,rep.url) route(rep,res,filePath) }) //监听server实例 server.listen(conf.port,conf.hostname,()=>{ constaddr=`http://${conf.hostname}:${conf.port}` console.info(`serverstartdat${chalk.green(addr)}`) })
至此实现了通过hash路径输入,实现文件或文件夹的读取/前进后退
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。