path模块
概述:
path模块是一个内置模块,他里面内置的相关方法来操作的路径地址。
基础使用
导入
const path = require('path')
使用
//导入对应的path模块
const path = require('path')
//相关方法讲解
//join方法是将多个相关的地址连接成一个地址 路径拼接
let pathStr = path.join('c://','list','/txt.txt')
console.log(pathStr);
//__dirname 全局变量表示当前的文件夹路径(绝对路径)
//__filename 全局变量表示当前的文件路径(绝对路径)
console.log(__dirname)
console.log(__filename)
console.log(path.join(__dirname,'hello.jpg'))
//normalize 默认返回对应的路径
console.log(path.normalize(__filename));
//resolve 返回一个路径地址 返回对应的一个路径 如果没有找到返回没有找到的路径
//将一个相对路径的地址返回一个绝对路径
console.log(path.resolve('./txt.txt'));
//isAbsolute 判断是否是一个绝对路径
console.log(path.isAbsolute(__dirname));
//relative 返回一个路径相对一个的路径 第一个相对的路径 第二个是对应的路径
console.log(path.relative(__dirname,__filename));
//获取当前的文件夹名字
console.log(path.dirname(__filename));
console.log(path.dirname('c/hello/html.html'));
//获取当前的文件名
console.log(path.basename('c:/hello/html.html'));
//获取对应的扩展名
console.log(path.extname('c:/hello/html.html'));
//转换位命名空间下的路径地址
console.log(path.toNamespacedPath(__filename));
path模块的相关方法
join地址拼接*
dirname获取当前文件夹地址*
basename获取当前的文件名*
extname获取当前的扩展名*
resolve转绝对路径
relative转相对路径
normalize默认
isAbsolute判断是否为绝对路径
全局变量
_dirname获取当前的文件夹路径
_filename获取当前的文件路径
fs模块
概述
fs (fileSystem)文件系统,主要是对应文件及文件夹的增删改查。
基础使用
导入
const fs = require('fs')
使用
//导入fs模块
const fs = require('fs')
const path = require('path')
//文件相关操作从根本上来说都是异步的
//获取stats对象 sync表示当前是同步的 他会直接返回对应的结果 没有sync就异步的(callback promise)
let stats = fs.statSync(path.resolve('./hello.txt'))
//判断当前是否是一个文件
console.log(stats.isFile());
//判断是否是文件夹
console.log(stats.isDirectory())
//相关stats的属性
console.log(stats.birthtime);//创建时间
console.log(stats.atime);//上一次修改的时间
console.log(stats.ctime);//当前时间
console.log(stats.blksize);//大小
stats的相关方法及获取
fs.statSync获取stats对象
stats的相关方法及属性
方法
isFile 判断是否是文件
isDirectory 判断是否是文件夹
属性
birthtime 创建时间
atime 上一次修改时间
ctime 当前时间
blksize文件大小
文件及文件夹相关操作
文件读取相关操作(返回一个buffer类型数据)
readFile异步读取文件
readFileSync同步读取文件
//文件相关操作
//文件的读取 缓冲区(buffer)读取的内容是buffer
fs.readFile('./hello.txt','utf8',(err,data)=>{
if(err){
throw new Error(err) //抛出错误
}
console.log(data.toString())
})
//try 捕获错误 catch处理错误
try {
let buffer = fs.readFileSync('./hello.txt','utf8')
console.log(buffer.toString())
} catch (error) {
console.log('文件读取出错')
}
文件夹读取相关操作(返回第一层的文件名字符串数组)
readdir 异步读取文件夹
readdirSync同步读取文件夹
//读取文件夹 读取所有的文件列表 只能读取第一层
fs.readdir('./demo',(err,files)=>{
if(err){
throw new Error(err)
}
console.log(files);
})
try {
let files = fs.readdirSync('./demo')
console.log(files);
} catch (error) {
console.log('文件读取出错');
}
//读取对应的文件链接 读取的是网络路径 (类似于读文件)
// fs.readlink('./hello.txt','utf8',(err,linkString)=>{
// if(err){
//
throw new Error(err)
// }
// console.log(linkString);
// })
// //读取的是文件或者文件夹
// fs.readlinkSync('https://jsonplaceholder.typicode.com/todos','utf-8')
// fs.read() 指定对应的开始位置进行读取
// fs.readv 指定位置读取 返回对应的字节
文件写入相关操作(没有文件会自动创建文件)
writeFile 异步覆盖写入文件内容
writeFileSync 同步覆盖写入文件内容
appendFile 异步追加内容到文件
appendFileSync 同步追加内容到文件
//文件写入
//如果文件不存在会自动创建文件 如果里面存在内容会覆盖
fs.writeFile('./user.txt','你吃饭了吗',(err)=>{
if(err){
throw new Error()
}
console.log('文件写入成功');
})
fs.writeFileSync('./hello.txt','你吃饭了吗')
//追加内容
fs.appendFile('./hello1.txt','我是追加的内容',()=>{
console.log('文件追加成功');
})
fs.appendFileSync('./user.txt','追加')
文件夹创建
mkdir 异步创建文件夹
mkdirSync 同步创建文件夹
//创建文件夹 mkdir
fs.mkdir('新建文件夹',()=>{
console.log('创建文件夹成功');
})
//判断当前的文件夹是否存在
console.log(fs.existsSync('新建文件夹'));
if(!fs.existsSync('新建文件夹')){
fs.mkdirSync('新建文件夹')
}
existsSync 判断文件路径是否存在
文件重新命名
rename 异步更改名字
renameSync 同步更改名字
fs.rename('新建文件夹','当前文件夹',()=>{
console.log('更名成功');
})
fs.renameSync('./demo/hello.txt','./demo/hi.txt')
文件删除相关
unlink 删除文件
unlikeSync 同步删除文件
rm 删除文件
rmSync 同步删除文件
//删除文件及文件夹
//删除文件
fs.unlink('./demo/你好世界/helloWorld.js',()=>{
console.log('删除成功');
})
fs.unlinkSync('./demo/hi.txt')
fs.rm('./user.txt',()=>{
console.log('删除文件成功');
})
fs.rmSync('./达到/哈哈哈.js')
fs.rmdirSync('./demo/你好世界')
fs.rmdir('./demo',(err)=>{
if(err){
throw new Error(err)
}
console.log('删除成功');
})
文件夹删除
rmdir
rmdirSync
更改文件权限
chown 异步更改所有者
chownSync 同步更改所有者
//更改文件权限 777 可读可写可执行 1 2 4 三个用户 自身 同组的 其他的用户
fs.chown('./达到/hahah.html',1,2,()=>{
console.log('所有者更改');
})
计算当前文件夹下的所有文件格式及目录个数并打印出来对应的内容
//导入fs模块及path模块
const fs = require('fs')
const {
join
} = require('path')
//准备初始的文件夹个数及文件个数
let dirCount = 0
let fileCount = 0
//递归打印
const compute = (path) => {
try {
//判断当前文件夹是否存在
//如果文件夹不存在那么直接返回
if (!fs.existsSync(path)) return
//读取当前文件夹的内容
let files = fs.readdirSync(path) //获取当前文件下的数组
//遍历数组
files.forEach(file => {
//判断当前file是否为文件夹
//得到stats对象
let stats = fs.statSync(join(path, file))
//判断当前的路径是否为文件夹
if (stats.isDirectory()) {
console.log('文件夹有' + join(path, file));
dirCount++
//递归
compute(join(path, file))
} else {
//是文件
console.log('文件有' + join(path, file));
fileCount++
}
})
} catch (error) {
}
}
compute('D://')
console.log(`文件夹数量为${dirCount},文件数量为${fileCount}`);
events模块
核心对象EventEmitter(观察者)
on 监听事件
off 取消事件
emit 执行事件
once 监听事件一次
//导入events模块
//EventEmitter他是一个类
const EventEmitter = require('events').EventEmitter
let eventEmitter = new EventEmitter()
//调用对应的方法
const handler = (...arg)=>{
console.log(...arg);
console.log('处理了对应的事件');
}
//事件名(没有要求) 处理函数
eventEmitter.on('abc',handler)
//取消事件
eventEmitter.off('abc',handler)
//执行 (emit方法传递的参数会被传递给对应的处理函数)
eventEmitter.emit('abc',1,2,3)
//once执行异常
eventEmitter.once('bcd',function(arg){
console.log('执行一次的内容'+arg);
})
eventEmitter.emit('bcd','hello')
fs模块结合http模块实现简单的登录注册
api.js
//导入fs模块
const fs = require('fs')
const md5 = require('md5')
//获取对应的json里面的数据进行判断当前是否已经注册
const checkUserExitsByUserName = (username) =>{
//遍历查询是否存在
return getDB().users.some(user=>user.username==username)
}
//将数据写入对应的json文件
const addUser = (user)=>{
let db = getDB()
db.users.push(user)
//将对应的users写入到json文件
fs.writeFileSync('./db.json',JSON.stringify(db))
}
//查询json文件里面的用户名和密码是否一致
const login = (username,password)=>{
let arr = getDB().users.filter(user=>user.username == username &&
user.password == md5(user.slat + password + user.slat))
return arr[0]?arr[0]:null
}
//获取对应的db.json中的数据
const getDB=()=>{
let jsonStr = fs.readFileSync('./db.json').toString()
//将这个json字符串转为对象
return JSON.parse(jsonStr)
}
//导出对应的方法
module.exports = {
addUser,
login,
checkUserExitsByUserName
}
主文件
//导入http模块
const http = require('http')
//导入url模块
const {
parse
} = require('url')
//导入url模块
const {
decode
} = require('querystring')
//导入uuid模块
const uuid = require('uuid')
//导入md5模块
const md5 = require('md5')
//导入对应的api文件
const {
addUser,
checkUserExitsByUserName,
login
} = require('./api')
//利用http完成对应的服务
let server = http.createServer()
//利用events模块来进行相关监听 监听服务的请求
server.on('request', (req, res) => {
//设置响应头
res.setHeader('content-type','application/json;charset=utf-8')
res.setHeader('Access-Control-Allow-Origin','*')
res.setHeader('Access-Control-Allow-Origin-Method','*')
//响应对象
const response = {
code: 200,
messgae:
'
OK',
data: null
}
//获取路由
let router = parse(req.url).pathname
//根据对应的请求方式来进行相关的参数获取
if (req.method == 'POST') {
let params = ''
//监听数据
req.on('data', (chunk) => {
params += chunk
})
//监听请求完成
req.on('end', () => {
//将数据字符串转换为对象
let {
username,
password,
sex
} = decode(params)
//根据对应的路由来完成操作
switch (router) {
case
'
/login': //登录
//查询json文件里面的用户名和密码是否一致
let user = login(username, password)
if (user) {
response.data = user
response.messgae =
'
登录成功'
} else {
response.messgae =
'
用户名或密码错误'
}
res.end(JSON.stringify(response))
break;
case
'
/register': //注册
//获取对应的json里面的数据进行判断当前是否已经注册
if (checkUserExitsByUserName(username)) {
response.messgae =
'
当前用户已经注册'
} else {
//将数据写入对应的json文件
let slat = (Math.random(10000) + 10000).toString(32)
let user = {
id: uuid.v4(),
username,
password: md5(slat + password + slat),
sex,
slat
}
addUser(user)
//设置响应的信息及数据
response.data = user
response.messgae =
'
注册成功'
}
res.end(JSON.stringify(response))
break;
}
})
}
})
server.listen('8080', () => {
console.log('服务已经启动');
})