js的33天(node)

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('服务已经启动');

})

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,443评论 6 532
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,530评论 3 416
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,407评论 0 375
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,981评论 1 312
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,759评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,204评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,263评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,415评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,955评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,782评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,983评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,528评论 5 359
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,222评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,650评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,892评论 1 286
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,675评论 3 392
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,967评论 2 374

推荐阅读更多精彩内容

  • 1 服务器创建 创建服务器利用require引入http模块:var http=require("http")利用...
    果木山阅读 333评论 0 1
  • 二. 模块化 Node.js所有的API都是基于模块发布和使用的,因此在真正的学习Node.js之前,我们需要先了...
    小五同学H阅读 337评论 0 0
  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,486评论 1 37
  • Node.js_fs文件系统(三) fs.stat()判断文件类型isFile():判断是否是一个文件isDire...
    learninginto阅读 253评论 0 4
  • 事件驱动 NodeJs是单线程、非阻塞I/O的事件驱动;不同于Java/PHP/.net等服务器语言,NodeJs...
    hellomyshadow阅读 259评论 0 1