nodejs学习笔记(一)

1、http模块

//引入http模块
var http = require('http');
const url = require('url');

// request :获取客户端传过来的信息
// response: 给浏览器响应信息
http.createServer((req, res) => {
    // 获取浏览器访问的url地址
    console.log(req.url);
    if(req.url!='/favicon.ico'){
        var userInfo = url.parse(req.url,true).query;
        console.log(userInfo)
        console.log(`姓名:${userInfo.name}——年龄:${userInfo.age}`)
    }
    // 设置响应头,状态码是200,文件类型是html,字符集是utf-8
    // 解决乱码
    res.writeHead(200, {
        'Content-Type': 'text/html',
        charset: 'utf-8'
    });
    // 解决乱码
    res.write("<head><meta charset='UTF-8'></head>")
    res.write('<h1>你好 world!</h1>')
    res.write('hello world!')
    res.write('<h2>启动supervisor成功</h2>')
    // response.end('Hello World');
    // 结束响应,必须调用
    res.end();
}).listen(3000);
2、url模块

const url = require('url');
var api = 'http://www.baidu.com?user=zhangsan&age=20';

// 解析url里面的参数,传入参数true,转化为对象
var getVal = url.parse(api,true).query;
console.log(getVal);
console.log(`姓名:${getVal.user}——年龄:${getVal.age}`)
3、supervisor工具

// supervisor是node的一个自启动工具
/*
使用方法:
    1、安装supervisor
    npm install -g supervisor
    2、使用supervisor代替node命令启动应用
    supervisor app.js
*/ 
4、fs模块

/*
1、fs.stat     检测是文件还是目录
2、fs.mkdir    创建目录
3、fs.writeFile    创建写入文件
4、fs.appendFile   追加文件
5、fs.readdir      获取目录
6、fs.rename       重命名  移动文件
7、fs.rmdir        删除目录
8、fs.unlink       删除文件
9、fs.readFile      读取文件
*/

const fs = require('fs');
const {
    resolve
} = require('path');
const {
    rejects
} = require('assert');

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

});

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

// 3、fs.writeFile    创建写入文件  如果不存在文件则创建,若存在则替换
/*
    filename    (string)    文件名称
    data        (string|buffer)     将要写入的内容,看可以是字符串或buffer数据
    options     (odject)       option数组对象,包含:
     -encoding   (string)   可选值,默认‘utf8’,当data是buffer时,该值应该为
     -mode      (Number)    文件读写权限,,默认值438
     -flag      (string)    默认值‘w’
    callback    (function)  回调,传递一个异常参数err.
*/
fs.writeFile('./html/index.html', '你好nodejs', (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('创建写入文件成功');
})

// 4、fs.appendFile   追加文件 没有该文件就创建,有的话就覆盖替换
fs.appendFile('./css/base.css', 'bode{color:red}', (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('appendFile 成功');
})

// 5、fs.readFile      读取文件
fs.readFile('./html/index.html', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
    console.log(data.toString()); //将buffer数据转换为string类型
})

// 6、fs.readdir      获取目录   [ 'index.html', 'news.html' ]
fs.readdir('./html', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
})

// 7、fs.rename       重命名  功能:1、重命名,2、移动文件
fs.rename('./css/aaa.css', './css/index.css', (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('重命名成功!');
});

// 移动文件
fs.rename('./css/index.css', './html/index.css', (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('移动文件成功!');
});

// 8、fs.rmdir        删除目录     目录里面有文件的时候不能删除目录
fs.rmdir('./aaa', (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('删除目录成功!');
});

//  9、fs.unlink       删除文件
fs.unlink('./aaa/index.html', (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('删除文件成功!');
});

// 列子:
// 1、判断服务器上面有没有upload目录,如果没有就创建这个目录,有的话不做操作。(图片上传)也可使用第三方的mkdirp模块
var path = './upload';
fs.stat(path, (err, data) => {
    if (err) {
        // 执行创建目录
        mkdir(path);
        return;
    }
    if (data.isDirectory()) {
        console.log('upload目录存在');
    } else {
        // 首先删除文件,再去创建目录
        fs.unlink(path, (err) => {
            if (!err) {
                mkdir(path);
            } else {
                console.log('请检测传入的数据是否正确');
            }
        })
    }
});

// 封装创建目录的方法
function mkdir(dir) {
    fs.mkdir(dir, (err) => {
        if (err) {
            console.log(err);
            return;
        }
    })
}

// 2、wwwroot文件夹下面有images css js 以及 index.html 找出wwwroot文件夹下面的所有目录,然后放入到一个数组中
// 注意:fs里面的方法都是异步方法
// 1、改造for循环,递归实现     2、使用async await
var path = './wwwroot';
var dirArr = [];
fs.readdir(path, (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data);
    // 递归
    (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)
});

// 使用async和await实现
// 1、定义一个isDir的方法判断一个资源到底时目录还是文件
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('+++++++++++++++++++++++++++++++++++++++++++');
        console.log(dirArr);
    })
}

main();
5、可读流、写入流、管道流

const fs = require('fs');
// 以流的形式读入文件
var readSteam = fs.createReadStream('./input.txt');
// 以流的形式写入文件
var writeSteam = fs.createWriteStream('./output.txt');

// 管道流   用于复制大文件
var readImgSteam = fs.createReadStream('./13.jpg');
var writeImgSteam = fs.createWriteStream('./wwwroot/13.jpg');

readImgSteam.pipe(writeImgSteam);



// 读入文件
var count = 0;
var str = '';

readSteam.on('data', (data) => {
    str += data;
    count++;
});

readSteam.on('end', () => {
    console.log(str);
    console.log(count);
});

readSteam.on('error', (err) => {
    console.log(err);
})


// 写入文件
var msg = '';
for (var i = 0; i < 500; i++) {
    msg += '收费的开放空间环境客户的房价快速导航看到函数返回\n'
}

writeSteam.write(msg);

// 标记文件末尾
writeSteam.end();

writeSteam.on('finish', () => {
    console.log('写入完成');
})
posted @ 2020-07-19 16:41  小笑残虹  阅读(149)  评论(0编辑  收藏  举报