Node——fs模块、异步

简介: Node——fs模块、异步

f s 模块

fs.stat()

检测是文件还是目录

fs.stat('./html', (err,data) => {
    if(err) {
        console.log(err)
        return;
    }
    console.log(data);
    console.log(`是文件:${data.isFile()}`)
    console.log(`是目录:${data.isDirectory()}`);
})

fs.mkdir()

创建目录

/*
    path           将要创建的目录路径
    mode           目录权限 (读写权限) , 默认777
    callback       回调, 传递异常参数err
*/
fs.mkdir('./css', (err) => {
    if(err) {
         console.log(err)
        return;
     }
     console.log('创建成功');
 })

fs.writeFile()

创建并写入文件

/*
filename    (String)              文件名称
data        (String | Buffer)     将要写入的内容  可以是字符串或buffer数据
options     (Object)              option数组对象,包含:
    1.encoding      (string)      可选值, 默认 'utf8',当 data 是 buffer时,
    2.mode          (Number)      文件读写权限, 默认值 438
    3.flag          (String)      默认值   'w'
    callback        {function}    回调, 传递一个异步参数err
*/
 fs.writeFile('./html/index.html', '你好nodejs', (err) => {
     if(err) {
         console.log(err)
        return;
     }
     console.log('创建写入文件成功');
 })
// 注意 ::     当没有要写入的这个文件时创建文件并写入,如果这个文件已经存在了,写入的内容将覆盖原先的文件内容

fs.appendFile()

追加文件

fs.appendFile('./css/base.css', 'body{color:red}', (err) => {
     if(err) {
         console.log(err)
         return;
    }
     console.log('appendFile 成功');
 })
//与writeFile() 功能相同, 不同的是  appendFile()是追加文件

fs.readFile()

读取文件

fs.readFile('./html/index.html', (err,data) => {
     if(err) {
         console.log(err)
         return;
     }
     console.log(data.toString())   //把Buffer  转化成string类型
 })

fs.readdir()

读取目录

fs.readdir('./html', (err, data) => {
     if(err) {
         console.log(err)
         return;
     }
     console.log(data);
 })

fs.rename()

重命名

//原名 原路径      //现名 现路径
 fs.rename('./css/aaa.css','./css/index.css', (err) => {
     if(err) {
         console.log(err)
         return;
     }
     console.log('重命名成功');
 })

fs.rmdir

删除目录

fs.rmdir('./aaaa', (err) => {
    if(err) {
        console.log(err)
        return;
    }
    console.log('删除目录成功');
})

fs.unlink()

删除文件

fs.unlink('./aaaa/index.html', (err) => {
    if(err) {
        console.log(err)
        return
    }
    console.log('删除文件成功');
})
// 删除文件夹,首先要先删除文件夹里面的文件 (先 unlink 后 fs.rmdir)

案例:
创建 upload目录

const fs = require('fs')
var path = './upload'
fs.stat(path, (err, data) => {
    // err 没有这个文件
    if(err) {
        mkdir(path)
        return;
    }
    //有这个文件时: 判断是文件类型还是目录类型
    // 文件类型:  1.删除该文件,执行成功后,创建目录
    if(!data.isDirectory) {
        fs.unlink(path, (err) => {
            if(!err) {
                mkdir(path)
            } else {
                console.log('请检测传入的数据是否正确');
            }
        })
    }
})
function mkdir(file) {
    fs.mkdir(file, (err) => {
        if(err) {
            console.log(err)
            return;
        }
        console.log('创建目录成功');
    })
}

wwwroot 文件夹下面有images css js 以及 indexedDB.html, 找出 wwwroot 目录下面的所有目录, 放到一个数组中

fs.readdir('./wwwroot', (err,data) => {
    if(err) {
        console.log(err)
        return;
    }
    console.log(data);
})
// 解决异步问题
// 1. 改造for循环 2. node.js里面的新特性 async await
const path = './wwwroot'
const dirArr = []
fs.readdir(path,(err,data) => {
    if(err) {
        console.log(err)
        return;
    }
    // =============异步解决办法一=================
     (function getDir(i) {
         if(i == data.length) {
             console.log(dirArr)
             return;
         }
         fs.stat(path+'/'+data[i], (error,stats) => {
             if(stats.isDirectory()) {
                 dirArr.push(data[i])
             }
             getDir[i+1]
         })
     })(0)
    // ==============这样写会出现异步================
    //for(var i =0; i<data.length;i++) {
    //   fs.stat(path+'/'+data[i], (error,stats) => {
    //        if(stats.isDirectory()) {
    //           dirArr.push(data[i])
    //    })
    //}
    //console.log(dirArr)
    // ============================================
})

异步解决办法二

async await

async function test() {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            var name = '张三 222'
            resolve(name)
        },1000)
    })
}
async function main() {
    var data = await test()
    console.log(data);
}
async function isDir(path) {
    return new Promise((resolve, reject) => {
        fs.stat(path, (error, stats) => {
            if(error) {
                console.log(error)
                reject(error)
                return;
            }
            if(stats.isDirectory()) {
                resolve(true)
            } else {
                resolve(false)
            }
        })
    })
}
function main() {
    var path = './wwwroot'
    var dirArr = []
    fs.readdir(path,async(err, data) => {
        if(err) {
            console.log(err);
            return
        }
        for(var i=0; i<data.length; i++) {
            if(await isDir(path + '/' + data[i])) {
                dirArr.push(data[i])
            }
        }
        console.log(dirArr);
    })
}
main()

从文件流中读取数据

fs.createReadStream

const fs = require('fs')
var readStream = fs.createReadStream('./data/input.txt')
var count = 0;
var str = '';
readStream.on('data', (data) => {  //监听
    str += data
    count++
})
readStream.on('end', () => {   //读取结束
    console.log(str)
    console.log(count);
})
readStream.on('error', (err) => {   //报错
    console.log(err);
})

fs.createWriteStream

// 从文件流中读取数据
const fs = require('fs')
var str = ''
for(var i = 0; i < 503; i++) {
    str+='我是从数据库获取的数据, 我要保存起来\n'
}
var writeStream = fs.createWriteStream('./data/output.txt')
writeStream.write(str);   //写入数据了
//标记写入完成  
writeStream.end()
//标记写入完成    监听写入完成情况前必须标记写入完成
writeStream.on('finish', () => {
    console.log('写入完成');
})

readStream.pipe()

//管道流    用于复制文件
const fs = require('fs')
var readStream = fs.createReadStream('./aaa.jpg')
var writeStream = fs.createWriteStream('./data/aaa.jpg')
readStream.pipe(writeStream)

静态资源方法

./module/routes.js 里面

const fs = require('fs')
const path = require('path');
const url = require('url')
// 私有方法
let getFileMime = function (extname) {
    // 方法一:
    // return new Promise((resolve, reject) => {
    //     fs.readFile('./data/mime.json', (err,data) => {
    //         if(err) {
    //             console.log(err);
    //             reject(err)
    //             return;
    //         }
    //         let mimeObj = JSON.parse(data.toString())
    //             console.log(mimeObj[extname]);
    //             resolve(mimeObj[extname])
    //     })
    // })
    // 方法二:
    var data = fs.readFileSync('./data/mime.json')  //同步方法
    let mimeObj = JSON.parse(data.toString())
    return mimeObj[extname]
}
exports.static = function (req, res, staticPath) {
     // 1. 获取地址
    // let pathname = req.url
    let pathname = url.parse(req.url).pathname
    pathname = pathname == '/' ? '/index.html' : pathname
    //获取后缀名
    let extname = path.extname(pathname)
    // 2. 通过fs模块读取文件
    if(pathname != '/favicon.ico') {
        fs.readFile('./'+ staticPath + pathname, (err,data) => {
            if(err) {
                res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'});
                res.end('404这个页面不存在')
            }
            let mime = getFileMime(extname)
            res.writeHead(200, {'Content-Type': ''+mime+';charset="utf-8"'})
            res.end(data);
        })
    }
}
// 三元运算分的基本格式  :   条件?真结果:假结果
// 三元表达式是如何对应if…else语句的?
// 条件 ? 真结果 : 假结果
// if(条件){真结果}else{假结果}
// 三元表达式的局限性
// 最后,大家注意,三元表达式在使用过程中不能使用break,continue等语句。否则…

./app03.js 里面

const http = require('http');
const routes = require('./module/routes')
http.createServer(function (req,res) {
    routes.static(req, res, 'static')
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

路由

路由 是由一个 URL 和一个特定的 HTTP 方法组成的,涉及到应用如何响应客户端对某个网站节点的访问.

即 : 针对不同请求的URL, 处理不同的业务逻辑

http.createServer(function (req,res) {
    routes.static(req, res, 'static')
    let pathname = url.parse(req.url).pathname
    if(pathname == '/login') {
        res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'})
        res.end("执行登录")
    } else if(pathname == '/register') {
        res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'})
        res.end("执行注册")
    } else if(pathname == '/admin') {
        res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'})
        res.end("处理后的业务逻辑")
    } else {
        res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'})
    }
}).listen(3000);


相关文章
|
7天前
|
存储 JavaScript 前端开发
nodejs os模块
nodejs os模块
17 0
|
6天前
|
存储 JavaScript API
Node.js中的异步API
【8月更文挑战第16天】
13 1
|
8天前
|
存储 缓存 JSON
Node.js有哪些模块系统
【8月更文挑战第12天】Node.js有哪些模块系统
20 3
|
1月前
|
数据采集 JavaScript 前端开发
NodeJS技巧:在循环中管理异步函数的执行次数
在Node.js网络爬虫开发中,管理异步函数执行次数是关键。利用Promise.all、async/await或async库能优雅地控制并发。示例展示如何用async/await配合代理IP抓取数据,避免触发反爬策略。在循环中,每个异步请求只执行一次,保证请求有序进行,提高爬虫的稳定性和效率。通过正确的方法,可以有效应对网络爬虫的挑战。
NodeJS技巧:在循环中管理异步函数的执行次数
|
26天前
|
存储 JavaScript 安全
Node中的AsyncLocalStorage 使用问题之AsyncLocalStorage与node:async_hooks模块的问题如何解决
Node中的AsyncLocalStorage 使用问题之AsyncLocalStorage与node:async_hooks模块的问题如何解决
|
26天前
|
存储 JavaScript 前端开发
Node中的AsyncLocalStorage 使用问题之async_wrap 模块是如何与 libuv 交互的
Node中的AsyncLocalStorage 使用问题之async_wrap 模块是如何与 libuv 交互的
|
26天前
|
监控 JavaScript 前端开发
Node中的AsyncLocalStorage 使用问题之Node.js内部模块和外部模块的加载的问题如何解决
Node中的AsyncLocalStorage 使用问题之Node.js内部模块和外部模块的加载的问题如何解决
|
1月前
|
资源调度 前端开发 开发工具
阿里云云效操作报错合集之Node-Sass模块在构建过程中,出现报错"ENOENT: no such file or directory, scandir ",该如何处理
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
1月前
|
JavaScript
【Node.js基础02】fs、path模块
【7月更文挑战第17天】
10 0
|
1月前
|
JSON JavaScript 前端开发
死磕Node模块兼容性,ESM和CJS我全都要!
死磕Node模块兼容性,ESM和CJS我全都要!
75 0