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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿选不出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值