nodejs fs模块结合async await处理fs异步使用

简介: nodejs fs模块结合async await处理fs异步使用

判断服务器上有没有upload目录 如果没有创建这个目录 有的话不操作

1.方式1

注意 即便没有这个目录但是也要看下有没有同名的无后缀的文件做干扰

在这里插入图片描述

**判断服务器上有没有upload目录 如果没有创建这个目录 有的话不操作**
const fs = require('fs');
var path = './upload';
fs.stat(path, (err, stat) => {
    if (err) {//没有这个文件
        dir(path);
        return;
    }
    if (!stat.isDirectory()) {//没有这个目录
      //判断是否有这个文件(因为没有后缀的文件和文件夹不能重名)  上图所示
        if (stat.isFile()) {//有这个没有后缀的文件
            fs.unlink(path, (err) => {//删除这个没有后缀的文件
                if (!err) {
                    console.log('删除文件成功'); 
                    dir(path)//创建目录
                } 
            })
        } else {//没有这个目录,也没有这个后缀的文件
            dir(path)//创建目录
        }
    } else {
        console.log('有upload目录');

    }
})
//封装函数创建目录
function dir(dir) {
    fs.mkdir(dir, (err) => {
        if (err) {
            return
        }
        console.log('创建upload目录');

    })
}

2.使用npm包快速实现功能
https://www.npmjs.com/package/mkdirp

1. npm  i mkdirp  --save  / cnpm i mkdirp --save
2. const mkdirp=require('mkdirp') 
3.使用
mkdirp('./upload').then(made =>
  console.log(`made directories, starting with ${made}`)
  )

判断wwwrouter下的文件是不是一个目录 是的话追加到数组中

1.方法1:

const fs = require('fs');
let path = './wwwroot';
let arr = [];
fs.readdir(path, (err, data) => {
    if (err) { throw err }
    for (let i = 0; i < data.length; i++) { 
        fs.stat(`${path}/${data[i]}`, (err, state) => {
            if (err) { throw err }
            if (state.isDirectory()) {
                arr.push(data[i]) 
            }
            if (i == data.length - 1) {
                console.log(arr)
            }
        })
    }
})

方法2,function函数自调用递归

const fs = require('fs');
let path = './wwwroot';
let arr = [];
fs.readdir(path, (err, data) => {
    if (err) { throw err }
    (function main(i) {
        if (i == data.length) {
            console.log(arr)
            return;
        }
        fs.stat(`${path}/${data[i]}`, (err, state) => {
            if (state.isDirectory()) {
                arr.push(data[i])
            }
            main(++i)
        })
    })(0)
})

方法3.es6 new Promise es7 async await

**async让方法变为异步返回promise await 等待异步方法执行完
await必须写在async内两者配合使用**

const fs = require('fs');
// 封装一个专门使用判断是否为目录的函数
 async function dir(path) {
    return new Promise((resolve, reject) => {
        fs.stat(path, (err, data) => {
            if (err) { throw err }
            if (data.isDirectory()) {
                resolve(true)
            } else {
                resolve(false)
            }

        })
    })
}

// 专门封装一个循环获取目录的函数
function main() {
    let path = './wwwroot'
    let arr = [];
    fs.readdir(path, async (err, data) => {
        for (var i = 0; i < data.length; i++) {
            await dir(`${path}/${data[i]}`).then(res => {
                if (res) {
                    arr.push(data[i])
                }
            })
        }
        console.log(arr)

    })
}
main()
相关文章
|
1月前
|
缓存 JavaScript 安全
nodejs里面的http模块介绍和使用
综上所述,Node.js的http模块是构建Web服务的基础,其灵活性和强大功能,结合Node.js异步非阻塞的特点,为现代Web应用开发提供了坚实的基础。
102 62
|
1月前
|
JavaScript 前端开发 开发者
掌握Node.js中的异步编程:从回调到async/await
Node.js的异步编程模型是其核心特性之一,它使得开发者能够构建高性能和高并发的应用程序。本文将带你从Node.js的异步编程基础开始,逐步深入到回调函数、Promises、以及最新的async/await语法。我们将探讨这些异步模式的原理、使用场景和最佳实践,并通过实例代码展示如何在实际项目中应用这些概念。
|
1月前
|
缓存 JSON JavaScript
Node.js模块系统
10月更文挑战第4天
37 2
|
1月前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
29 0
|
1月前
|
JavaScript 网络协议
Node.js 工具模块
10月更文挑战第7天
20 0
|
1月前
|
JavaScript 前端开发 应用服务中间件
Node.js Web 模块
Node.js Web 模块
|
2月前
|
存储 前端开发 JavaScript
node中循环异步的问题[‘解决方案‘]_源于map循环和for循环对异步事件配合async、await的支持
本文探讨了在Node.js中处理循环异步操作的问题,比较了使用map和for循环结合async/await处理异步事件的差异,并提供了解决方案。
35 0
|
JavaScript 关系型数据库 MySQL
Node.js学习笔记----mysql模块
Node.js学习笔记----mysql模块
|
JavaScript
Node.js学习笔记----模块的加载机制
Node.js学习笔记----模块的加载机制
|
JSON JavaScript 前端开发
Node.js学习笔记(六) express模块
Node.js学习笔记(六) express模块
130 0