nodejs 3分钟学会系列教程(4) fs模块 练习一下 async await

353 阅读2分钟

1、第一个 功能 判断服务器上面有没有upload目录,如果没有则创建,如果有则不改动

1)

  • 第一个思路 手动写一个 这个方法 第一种方法有点问题 之后再看
const fs = require("fs");

const path = "./upload";

fs.stat(path,(err,data)=>{
   if(err){
       //创建目录
       mkdir(path);
       return;
   }else{
       if(!data.isDirectory()){
           fs.unlink(path,err=>{
              if(!err){
               mkdir(path);
                  
              }else{
               console.log('请检查输入')
              }
               //创建目录
           })
       }
   }
})

// 创建目录 
function mkdir(dir){
   fs.mkdir(dir,(err)=>{
       if(err){
           console.log(err);
           return;
       }
   })
}
  • 第二个思路 使用 第三方包 mkdirp
  • 新建 demo-mkdirp 并且 在这个文件夹 安装 npm i mkdirp

const mkdirp = require("mkdirp");

mkdirp('./upload').then(made =>
   console.log(`made directories, starting with ${made}`))
  • 执行 之后 就会生成 upload 这个文件夹 如果存在的情况 不会发生变化

2、有一个文件夹 wwwroot 里面有 image css js index.html 需要找到文件夹下面所有的目录并且放到数组中(文件除外)

1)

const fs = require("fs"); //引入fs
var path = "./wwwroot"; //方便定义

var dirArr = []; //初始化结果
//读目录
fs.readdir(path, (err, data) => {
  if (err) {
    console.log(err);
    return;
  }
  //   这个一个立即执行函数
  (function getDir(i) {
    //   这个if是循环结束条件
    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);
});

3、 async await

1)先回顾几个东西

  • ES6 块作用域
  • 速写属性 key: value相同时 可写一个
  • 模版语法 ·${}· `` 用这个 包裹
  • 复习一下 promise使用 如何拿到函数内部的数据???
function getData(resolve, reject) {
  setTimeout(function () {
    var name = "fhj";
    resolve(name);
  }, 1000);
}

// 传入 函数
var p = new Promise(getData);

p.then((data) => {
  console.log(data); // 拿到内部数据 fhj
});


2)async await promise 使用方法

/*
1、await 必须包裹在 async里
2、async 函数 返回的是Promise 对象
*/
async function test() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      var name = "fhj";
      resolve(name);
    }, 1000);
  });
}

async function main() {
  var data = await test(); //获取异步方法里的数据
  console.log(data); // fhj
}
main();

3)回顾一下 前面的一个问题 现在怎么处理?? 写一个isDir 判断 是文件还是目录,并且将目录放进一个数组内

还是以 wwwroot 为例 将 wwwroot 文件夹拷贝到当前文件夹或者新建一下都可以的

// 1、isDir判断是目录-true  文件-false
const fs = require("fs");
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);
      }
    });
  });
}

// 2、获取 wwwroot 里面的所有资源 循环遍历
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(); //需要执行

  • 你可以 尽情尝试一下