node.js学习笔记--node.js基础(1)

前言
本次学习资源来源于B站:https://www.bilibili.com/video/av38925557?p=1
学习工程文件百度网盘:https://pan.baidu.com/s/11GO6Pnuo8dKzgY0JikdZLw
提取码:tm14
工具:node.js稳定版12.16.1 :https://nodejs.org/zh-cn/

1.http模块-建立web服务器
文件路径:demo02

//定义常量引用,防止修改
const http = require("http");

//req 获取url后所带参数  如http://127.0.0.1:3000/aaa    req中
//res 给浏览器响应信息
http.createServer(function(req,res){
    console.log(req.url);
    // 设置响应头 状态码是200 文件类型是html 字符集是utf-8
    res.writeHead(200,{"Content-type":"text/html;charset='utf-8'"});

    //设置html里字符集   注意多层双引号的使用
    res.write(" ");

    // 写入信息
    res.write('你好 node.js');

    //结束响应
    res.end('0');
}).listen(3000);//端口号多为3000以上   http://127.0.0.1:3000/

2.url模块-解析地址
文件路径:demo02
常用于获取地址后所带参数

const url = require("url");

var data01 = "http://www.baidu.com?name=张三&age=20";

//parse为解析方法    data01是网址,true是将解析的参数变为对象 方便调用
console.log(url.parse(data01,true).query.name);

true的作用 : name=张三&age=20 —> { name: ‘张三’, age: ‘20’ }

3.supervisor 模块安装
文件路径:demo02
1.安装node.js后 有npm
2.打开cmd npm install -g cnpm --registry=https://registry.npm.taobao.org 下载cnpm
3.继续cmd cnpm install -g supervisor
4.重启

作用:每次保存后重启supervisor执行的应用

4.暴露方法及引用
文件路径:demo03

var bar={
    get:function(){
        console.log("得到");
    },
    post:function(){
        console.log("上传");
    }
}

module.exports=bar; //暴露整个对象
exports.add=function(){
      console.log("add");
},

exports.del=function(){
    console.log("del");
}

//单个暴露

引用

// var request = require("./node_modules/request.js");和下行引用等同 
 var request = require("request");
 //在单层文件夹中,一般可以直接写 js文件名作为引用    
 /*在多层文件夹中,require会索引最里层文件夹的index.js   
   若使用cmd在最里层文件夹下 使用 npm init --yes 生产 package.json 则可以就可以使用了
 */
request.get();

var tools = require("tools/tools");
tools.add();

5.md5 字段加密模块
文件路径:demo04

/*    字段加密  md5
1.www.npmjs.com中找到包
2.在文件目录下打开cmd 下载    npm install md5 --save       
                             save是往package.json中写入md5依赖
3.引用 
4.npm install [email protected] --save    指定版本安装
*/


const md5 = require("md5");

console.log(md5("123456"));

6.silly-datetime 日期格式化模块
文件路径:demo04

/*   日期格式化
1.在网站上下载到本目录下   npm i silly-datetime --save
2.引用
*/ 


const sd = require("silly-datetime");
console.log(sd.format(new Date(),"YYYY-MM-DD HH:mm"));

7.package.json 模块描述文件
文件路径:demo04
在文件目录下 npm init --yes 生成,

{
  "name": "demo04",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",  //
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {       //文件依赖   若代码缺失  则使用npm i 来进行下载    
    "md5": "^2.2.1",       //^表示第一位保持不变  后两位取最新    *表示前两位不变,后两位取最新
    "silly-datetime": "^0.1.2"
    
  }
}

8.fs 文件操作
文件路径:demo05及demo008

var fs = require('fs');
//1.fs.stat  检测目标是否是文件或者目录
fs.stat('./package.json',(err,data)=>{
    if(err){
        console.log("路径错误");
        return;
    }
    else{
        console.log('目标是文件:'+data.isFile()); 
        console.log('目标是目录'+data.isDirectory());
        return;
    }
});

//2.fs.mkdir  创建文件
fs.mkdir('./map',(err)=>{
    if(err){
        console.log('创建失败或文件已存在');
        return;
    }else{
        console.log('创建成功');
        return;
    }
});

//3.fs.writeFile  创建写入文件  已存在就覆盖

fs.writeFile('./html/index.html','hello world!',(err)=>{
    if(err){
        console.log('创建或覆盖失败');
        return;
    }else
    {
        console.log('创建或覆盖成功!');
        return;
    }
});

//4.fs.appendFile 追加写入文件
fs.appendFile('./html/index.css','body{color:red}\n',(err)=>{
    if(err){
        console.log('写入文件失败');
        return;
    }else
    {
        console.log('appendFile seccuss');
        return;
    }
});

//5.fs.readFlie 读取文件(内)信息   data为buffer类型数据(16进制)

fs.readFile('./html/index.html',(err,data)=>{
    if(err){
        console.log('读取失败');
        return;
    }else
    {
        console.log('读取成功\n');
        console.log(data.toString());
        return;
    }
});

//6.fs.readdir 读取目录或文件(非文件内信息) 
fs.readdir('./html',(err,data)=>{
    if(err){
        console.log('读取失败');
        return;
    }else
    {
        console.log('读取成功');
        console.log(data);
    }
});

//7.fs.rename  重命名或移动文件
fs.rename('./html/index.html','./html/app.html',(err)=>{
    if(err){
        console.log('重命名或移动失败');
        return;
    }
    console.log('seccuss');
});

//8. fs.unlink  删除文件
fs.unlink('./map/name.js',(err)=>{
    if(err){
        console.log('fail');
        return;
    }
    console.log('seccuss');
});

//9.fs.rmdir  删除目录
fs.rmdir('./map',(err)=>{
    if(err){
        console.log('fail');
        return;
    }
    console.log('seccuss');
});

//10.fs.readStream  读取文件流
const fs = require('fs');
var name= '';
//建立读取文件流
var readstream = fs.createReadStream('./data/name.txt');
//监听文件流数据
readstream.on('data',(data)=>{
     name  += data;
    //  console.log(name);
});
//监听文件流结束
readstream.on('end',()=>{
    console.log(name);
});
//监听文件流错误
readstream.on('error',()=>{
    console.log(error);
});
//11.fs.writeStream写入文件流
const fs = require('fs');
var num = '';

for(var i = 0;i<500;i++){
    num += '今天天气很好\n';
}

//建立写入流
var writestream = fs.createWriteStream('./data/output.txt');
writestream.write(num);

//监听写入流
writestream.end();  //一定要有

writestream.on('finish',()=>{
    console.log('文件写入成功');
});

//

//12.文件流通道

const fs = require('fs');
//将readstream读取的文件写入到writestream的地址
var readstream = fs.createReadStream('./data/name.txt');
var writestream = fs.createWriteStream('./dd/time.txt');


//管道流复制文件  
readstream.pipe(writestream);

9.mkdirp 创建多层目录模块
文件路径:demo06

//在npmjs官网下载安装
const mkdirp = require('mkdirp');

mkdirp('./upload/demo02');

10.练习题(1)
文件路径:demo06
判断服务器上有没有upload目录。如果没有就创建 如果有不作操作

//判断服务器上有没有upload目录。如果没有就创建  如果有不作操作
const fs = require('fs');
var path = './upload';
fs.stat(path,(err,data)=>{
     if(err){
         //文件不存在
         console.log('不存在目录,正在创建...');
         mkdir(path);
         return;
     }
     //文件存在
     if(data.isDirectory()){
         //文件存在且为目录
         console.log('存在目录');
     }else  //文件存在且不为目录
     {
        fs.unlink(path,(err)=>{
            if(err){
                console.log('删除同名文件失败');
                return;
            }
            console.log('删除同名文件'); 
            mkdir(path);          
        });    
     }
});
function mkdir(dir){
     fs.mkdir(dir,(err)=>{
         if(err){
             console.log('创建失败');
             return;
         }
         console.log('创建成功');
     });
}

11.练习题(2)
文件路径:demo06
wwwroot文件夹下面有image css js 以及index.html 找出wwwroot目录下所有目录,然后放到一个数组中
方式一:

//2.wwwroot文件夹下面有image css js 以及index.html 找出wwwroot目录下所有目录,然后放到一个数组中
//fs为异步   无法用for循环来限制   用递归来代替

const fs = require('fs');
var path ='./wwwroot';
var 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,nr)=>{
            if(error){
                console.log(error);
                return;
            }
            if(nr.isDirectory()){
                dirArr.push(data[i]);               
                // console.log(dirArr);
            }
            getDir(i+1);

        })
    })(0);
   
});

方式二:

//2.wwwroot文件夹下面有image css js 以及index.html 找出wwwroot目录下所有目录,然后放到一个数组中
const fs = require('fs');
var dirArr = [];
const path = './wwwroot';

async function main(){
    //获取当前目录下的所有子目录及文件
    var nowdir = await Read(path);
    //console.log(nowdir);   //[ 'css', 'image', 'index.html', 'js' ]
    //判断文件是否为目录
    for(var i = 0;i<nowdir.length;i++){
       //检查每个文件是否是文件夹                 
        if(await Check(nowdir[i])){
            dirArr.push(nowdir[i]);
        }
    }
    console.log(dirArr);
}

main();
//读取目录  返回子目录
async function Read(path){
    return new Promise((resolve,reject)=>{
        fs.readdir(path,(err,data)=>{
            //读取目录失败
            if(err){
                console.log('打开目录失败');
                return;
            }
            //读取目录成功
            resolve(data);      
        });
    });

    }
//检测是否为文件    返回true false
async function Check(data){
    return new Promise((resolve,reject)=>{
           var nowPath = path+'/'+data;
           console.log('1111'+nowPath);
            fs.stat(nowPath,(error,checkdata)=>{
                //检测失败
                if(error){
                    console.log("检测"+nowPath+"文件失败");
                    reject(error);
                    return;
                }
                //检测成功
                if(checkdata.isDirectory()){
                    resolve(true);
                }else{
                    resolve(false);
                }
    
            }); 
    });    
}

12.Promise 用法

//回调方式  外部获取异步方法里面的数据
function getData(callbck){
    setTimeout(()=>{
        var name = '张三';
        callbck(name);
    },1000);
}
getData((aaa)=>{
    console.log(aaa);
});

//promise的用法一    resolve成功的回调函数           reject失败的回调函数
var p = new Promise(function(resolve,reject){
    setTimeout(()=>{
        var name = '张三';
        resolve(name);
    },1000);
});
p.then(function(data){
     console.log(data);
})

//promise用法二
function getData(resolve,reject){
    setTimeout(()=>{
        var name = '张三';
        resolve(name);
    },1000);
}
var p = new Promise(getData);
p.then(function(aaa){
         console.log(aaa);
});

13.async 声明异步方法,await 等待异步方法完成
文件路径:demo08

//async 声明异步方法返回一个promise        await 等待异步方法完成且只能用在异步方法中
// async 取异步方法中的值
async function add(){
    var name = 'liu';
    return name;
}
// console.log(add());
//输出   Promise { 'liu' }

async function main(){
    var dd= await add();
    console.log(dd);
}

main();



//用async 封装一个异步方法  并可以从外部调用 取异步方法中的值
async function test(){
    return new Promise((resolve,reject)=>{
       setTimeout(()=>{
        var name = '1111';
        resolve(name);
       },1000);
    });
}

async function main(){
    var dd = await test();   //await必须放在async方法中
    console.log(dd);
}
main();

14.非阻塞式IO
文件路径:demo10

//非阻塞式io
const fs = require('fs');

function getdata(){   //异步方法
    console.log('1');
    fs.readFile('./mime.json',(err,data)=>{
        console.log('2');
    });
    console.log('3');
}                                      //打印  1  3  2
getdata();

15.回调函数(处理异步)
文件路径:demo10

const fs = require('fs');

function test1(callback){
     
     fs.readFile('mime.json',(err,data)=>{
       callback(data.toString()); //

     });
    
}

test1((res)=>{
    console.log(res);
});

16.events.EventEmitter 广播与监听(处理异步)
文件路径:demo10
当使用events.EventEmitter时
http模块中
res.write(data);
res.end();
会报错
改为:
//res.write();
res.end(data);

//引入events模块   实例化EventEmitter类来绑定和监听事件
const events =require('events'); 

var EventEmitter=new events.EventEmitter(); //实例化

//广播
setTimeout(function(){
    console.log('开始广播...');
    EventEmitter.emit('function_name','发送的数据');  //不用定时器就监听不到
},2000);


//监听广播
EventEmitter.on('function_name',()=>{
    console.log('接收到广播了');
});

你可能感兴趣的:(node.js,nodejs)