nodejs的常用模块学习记录

nodejs的学习记录

模块化

我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块

- 模块分成两大类

        核心模块                                                                
            由node引擎提供的模块,即内部模块
        文件模块
            用户自己创建的模块

文件1

/*
    模块化
        在node中,一个js文件就是一个模块
        在Node中,每一个js文件中的js代码都是独立运行在一个函数中,即在一个独立的作用域中
            而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
*/
console.log('我是一个模块,我来自01.js文件');
let x = 10;
let y = 20;

/*
我们可以通过 exports 来向外部暴露变量和方法
    只需要将需要暴露给外部的变量或方法设置为exports的属性即可
*/ 

// 向外暴露属性或方法
exports.x = '我是文件1的js变量x';
exports.fun1 = function(){
    console.log('我是文件1的方法!!!')
}

文件2

/*
    模块化
        在node中,一个js文件就是一个模块
    引入其他的模块
        在node中,通过require()函数来引入外部的模块【其他js文件】
            require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部js模块【文件】
            这里路径,如果使用相对路径,必须以.或..开头

    使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块,其实就是另一个模块暴露给我们的那个对象,
*/  
// 导入一个js模块
let md = require('./01');


global对象是node中的一个全局对象,类似于Windows对象

	在全局中创建的变量都会作为global的属性保存
	在全局中创建的函数都会作为global的方法保存
//声明一个全局变量
a = 10;  // 没有使用let或者var 关键字声明的变量就是全局变量

当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
		function (exports, require, module, __filename, __dirname) {

在代码的最底部,添加如下代码
		}

实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参,也就是每个js文件有这5个属性
	 exports
	 	- 该对象用来将变量或函数暴露到外部

	 require
	 	- 函数,用来引入外部的模块

	 module
	 	- module代表的是当前模块本身
	 	- exports就是module的属性
	 	- 既可以使用 exports 导出,也可以使用module.exports导出

	 __filename
		C:\Users\lilichao\WebstormProjects\class0705\01.node\04.module.js
		- 当前模块的完整路径

  	 __dirname
		C:\Users\lilichao\WebstormProjects\class0705\01.node
		- 当前模块所在文件夹的完整路径
		- 

exports 和 module.exports

	- 通过exports只能使用.的方式来向外暴露内部变量
		exports.xxx = xxx

	- 而module.exports既可以通过.的形式,也可以直接赋值
		module.exports.xxx = xxxx
		module.exports = {}

NPM 的使用

使用node就是创建项目时,即创建npm包时,
	需要先创建一个package.json文件
		使用命令  npm  init  --yes
		【npm i】下载json文件中所依赖的包

查看版本

	npm  -v

查看帮助说明

	nmp

搜索模块包

npm  search  包名

在当前目录下安装指定包

npm install  包名     或者    npm   i   包名      install可以简写成i

全局模式下安装包

npm  install  包名   -g

包(package)

		将多个模块组合为一个完整的功能,就是一个包
	- 包结构
		bin
			- 二进制的可执行文件,一般都是一些工具包中才有
		lib
			- js文件
		doc
			- 文档
		test
			- 测试代码
		package.json
			- 包的描述文件
			
	- package.json	
		- 它是一个json格式的文件,在它里面保存了包各种相关的信息
			name 包名
			version 版本
			dependencies 依赖
			main 包的主要的文件
			bin 可执行文件

npm(Node Package Manager node的包管理器)

	- 通过npm可以对node中的包进行上传、下载、搜索等操作
	- npm会在安装完node以后,自动安装

npm的常用指令

		npm -v 查看npm的版本
		npm version 查看所有模块的版本
		npm init --yes 初始化项目(创建package.json)
		npm i/install 包名 安装指定的包
		npm i/install 包名 --save 安装指定的包并添加依赖
		npm i/install 包名 -g 全局安装(一般都是一些工具)
		npm i/install 安装当前项目所依赖的包
		npm s/search 包名 搜索包	
		npm r/remove 包名 删除一个包

文件系统,即对文件的操作

  • Buffer(缓冲区)
  •   - Buffer和数组的结构的非常类似,Buffer是用来存储二进制数据的
      - Buffer的方法
      	- Buffer.from(字符串)
      		- 将一个字符串中内容保存到一个buffer中
      	- buf.toString()
      		- 将buffer转换为一个字符串
      	- Buffer.alloc(size)
      		- 创建一个指定大小的buffer对象
      	- Buffer.allocUnsafe(size)
      		- 创建一个指定大小的buffer对象,可以包含敏感数据
    
/*
    Buffer(缓冲区)
        Buffer的结构和数据很像,操作的方法也和数据类似
        使用buffer不需要引入模块,直接使用即可
        在buffer中存储的都是二进制数据,但是在显示时都是以16进制的形式显示的
            buffer中每一个元素的范围是从00 - 方法 0-255  //0000000 --11111111
            计算机中一个0 或一个1我们称为1位(bit)
            8个bit = 1个byte(字节)
            1024byte = 1kb
            1024kb = 1mb
            1024mb = 1gb
            1024gb = 1tb

            buffer中的一个元素,占用内存的一个字节
          Buffer的大小一旦确定,则不能修改,Buffer实际上是对底层内存的直接操作
 */
var str="hello xiaoai";

// 将一个字符串保存到buffer中,通过buffer的from方法添加
var buf=Buffer.from(str);
//console.log(buf.length); //输出的是内存的大小,一个中文占用3个字节
//console.log(str.length);// 输出的是该字符串的长度
console.log(buf);

// 创建一个指定大小的buffer(缓冲区)
//buffer构造函数都是不推荐使用的
// var buf2 = new Buffer(10); //10个字节的buffer
//console.log(buf2.length);

//创建一个10字节的buffer
var buf2 = Buffer.alloc(10);
// 通过索引,来操作buf中的元素
buf2[0]=88;
buf2[1]=255;
buf2[2]=0xaa;
console.log(buf2);

//只要数字在控制台或页面中输出一定是10进制
//console.log(buf2[2].toString(16)); //表示将该数据转换为16进制转换为字符串显示输出出来
/*
for(let i=0;i<buf2.length;i++){
    console.log(buf2[i]);
}
*/

/*
    Buffer.from(str)  将一个字符串的转换为buffer/将该字符串添加到一个buffer缓冲区
    Buffer.alloc(size)  创建一个指定大小的Buffer缓冲区
    Buffer.allocUnsafe(size)  和上面的方法一样,创建一个指定大小的缓冲区,但是他不会清空该字节原来的数据,存在安全隐患,可能包含敏感数据
    buf.toString()  将缓冲区中的数据转换为字符串
 */
var buf5=Buffer.from("我是小爱同学,爱你哦");
console.log(buf5.toString());

fs模块

  • 在Node通过fs模块来对系统中的文件进行操作,fs模块是node中已经继承好了,不需要在使用npm下载,直接引入即可
  •   - 引入fs
      	var fs = require("fs");
    

系统文件fs模块的常用方法

1,fs.stat 检测是否是文件还是目录/文件夹
2,fs.mkdir 创建一个文件夹/目录
3,fs.writeFile 创建一个文件与写入文件(简单写入)
4,fs.appendFile 追加文件,文件不存在会自动创建,存在就会在文件内容后面追加写入内容
5,fs.readFile 读取文件
6,fs.readdir 读取目录/文件夹
7,fs.rename 重命名文件和移动文件 功能1,表示重命名 2,移动文件
8,fs.rmdir 删除目录/文件夹
9,fs.unlink 删除文件

/*
系统文件fs模块的常用方法
    1,fs.stat   检测是否是文件还是目录/文件夹
    2,fs.mkdir  创建一个文件夹/目录
    3,fs.writeFile   创建一个文件与写入文件(简单写入)
    4,fs.appendFile  追加文件,文件不存在会自动创建,存在就会在文件内容后面追加写入内容
    5,fs.readFile  读取文件
    6,fs.readdir  读取目录/文件夹
    7,fs.rename 重命名文件和移动文件  功能1,表示重命名 2,移动文件
    8,fs.rmdir  删除目录/文件夹
    9,fs.unlink  删除文件

*/

// 引入文件系统模块
const fs = require('fs');

// 1,fs.stat   检测是否是文件还是目录/文件夹
fs.stat('./html', (err, data) => {
    // err参数为空代表检测成功
    // data要检测的文件对象
    if (err) {
        console.log(err);
        return;
    }
    console.log(`是文件;${data.isFile()}`);
    console.log(`是目录;${data.isDirectory()}`);
});


// 2,fs.mkdir  创建一个文件夹/目录
/**
    参数一,path  要创建的目录/文件夹路径
    参数二,mode  目录权限(读写权限),默认777,可选参数
    参数三,callback   回调函数/回调函数可以使用箭头函数,他们功能差不多,传递异常参数err err值为空,代表创建成功
 */
fs.mkdir('./css', (err) => {
    if (err) {
        console.log(err); //输出错误信息
        console.log('文件夹已存在');
        return; // 中断函数的运行
    }
    console.log('创建成功,棒棒达(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤');
});


// 3,fs.writeFile   创建一个文件与写入文件(简单写入)
//    参数一path  创建与写入文件的路径
//    参数二data  要写入文件的数据
//    参数三callback  回调函数,里面一个参数err,返回的是写入是否成功

fs.writeFile('./html/index.html', '你好,这个参数是写入的内容,是个字符串类型', (err) => {
    if (err) {
        console.log(err);
        console.log('文件写入失败');
        return;
    }
    console.log('创建写入文件成功啦,好厉害,爱你');
});


// 4,fs.appendFile  追加文件,文件不存在会自动创建,存在就会在文件内容后面追加写入内容
// 参数一,你要追加写入的文件路径
// 参数二,你要追加的内容
// 参数三,回调函数,返回判断是否最近成功
fs.appendFile('./css/base.css', 'h3{color:red}\n', (err) => {
    if (err) {
        console.log(err);
        console.log('文件追加失败');
        return;
    }
    console.log('创建追加写入文件成功啦,好厉害,爱你');
});



// 5,fs.readFile  读取文件
// 参数一path 要读取的文件的路径
// 参数二encoding  读取的编码类型,utf-8 即可
// 参数三callback   回调函数
//      err 表示读取的状态 null为读取成功
//      data  表示读取到的数据 
fs.readFile('./html/index.html', 'utf-8', (err, data) => {
    if (err) {
        console.log(err);
        console.log('文件读取失败');
        return;
    }
    console.log(data);
    console.log('文件读取成功啦,好厉害');

});

// 6,fs.readdir  读取目录/文件夹
// 参数一path 要读取的目录的路径
// 参数二callback   回调函数
//      err 表示读取的状态 null为读取成功
//      data  表示读取到的数据 
fs.readdir('./html', (err, data) => {
    if (err) {
        console.log(err);
        console.log('文件目录读取失败');
        return;
    }
    console.log(data);
    console.log('文件目录读取成功啦,好厉害,上面输出的就是该目录下的所有文件名信息');

});



// 7,fs.rename 重命名文件和移动文件  功能1,表示重命名 2,移动文件
// 重命名文件
fs.rename('./css/aaa.css', './css/index.css', (err) => {
    if (err) {
        console.log(err);
        console.log('文件重命名失败');
        return;
    }
    console.log('重命名成功');
});
// 移动文件
fs.rename('./css/aaa.css', './html/index.css', (err) => {
    if (err) {
        console.log(err);
        console.log('文件移动失败');
        return;
    }
    console.log('移动文件成功');
});





// 8,fs.rmdir  删除目录/文件夹(文件夹/目录必须为空才能删除,否则删除失败)
fs.rmdir('./aaaa', (err) => {
    if (err) {
        console.log(err);
        console.log('目录删除失败');
        return;
    }
    console.log('目录删除成功');
});





// 9,fs.unlink  删除文件
fs.unlink('./要被删除的问价.html', (err) => {
    if (err) {
        console.log(err);
        console.log('文件删除失败');
        return;
    }
    console.log('文件删除成功');
});


// 10 流式文件的读取
var rs = fs.createReadStream('./html');// 创建一个可读流
var count = 8;
var str = '';
rs.on('data', (data) => {
    // data就是读取到的数据,可读流必须通过监听data事件来获取读取到的事件
    str += data;
    count++;
});
rs.on('end', () => {
    // 该事件可获取到什么时候读取结束,读取结束时触发
    console.log(str);
    console.log(count);
});
rs.on('error', (err) => {
    // 该事件可以获取到文件读取失败的信息
});

// 11 流式文件的写入
var ws = fs.createWriteStream('./html/index.html');// 创建一个可写流
ws.write('我就是写入的内容,该方法第一参数就是写入的内容,第二个参数可以设置为utf-8');
ws.end();//这个必须最后加上,表示文件写入结束
ws.on('finish', () => {
    console.log('该事件可以监听事件写入完成');
})


// 12  管道流,用于复制文件
var rs = fs.createReadStream('./要被删除的文件.html');
var ws = fs.createWriteStream('./html');
rs.pipe(ws); //即可将读取到的文件同步写入到指定的文件中



fs模块中的大部分操作都提供了两种方法,同步方法和异步方法

		同步方法带sync
		异步方法没有sync,都需要回调函数

写入文件

1.同步写入

/*
    文件系统(file system)
        文件系统简单来说就是通过node来操作系统中的文件
        使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
    同步文件的写入
        手动操作的步骤
            1,打开文件
                fs.openSync(path,flags,[mode])
                    参数path  要打开文件的路径
                    参数flags 打开文件要做的操作类型
                        r 只读
                        w 可写的
                    参数mode 设置文件的操作权限,一般不传
                 返回值
                    该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作

            2,向文件中写入内容
                fs.writeSync(fd,string,[position],[encoding])
                    参数fd 文件的描述符,需要传递要写入的文件的描述符
                    string  要写入的内容

            3,保存并关闭文件
                fs.closeSync(fd)
                    参数fd 要关闭的文件的描述符

 */
//引入文件系统模块
var fs = require("fs");
// 打开一个文件,模式设为写入
var fd = fs.openSync("hello.txt","w");
//向文件写入内容
fs.writeSync(fd,"你好,我是小爱同学,爱你哦");
//关闭文件
fs.closeSync(fd);


2.异步写入

/*
    异步文件的写入
    fs.open(path,flags,[mode],callback)
        参数比同步的方法多了一个回调函数
        异步的调用方法,结果都是通过回调函数的参数来返回的
        回调函数有两个参数
            第一参数arr   错误对象,如果没有错误则为null
            第二个参数fd  文件的描述符
    fs.write(fd,string,[position],[encoding],callback)
        参数也是比同步写入多一个回调函数,里面有一个参数就是rr   错误对象,如果没有错误则为null
        用来异步写入一个文件
    fs.close(fd,callback)
        用来关闭文件
        参数也是比同步关闭多一个回调函数,里面有一个参数就是rr   错误对象,如果没有错误则为null

 */
// 引入文件系统模块
var fs=require('fs');
// 打开文件
fs.open("hello2.txt","w",function (err,fd) {
   // console.log(arguments);//输出该函数函数里面的形参,参数
    //判断是否出错,是否成功打开文件
    if(!err){
        // 如果没有出错,则对文件进行写入操作
        fs.write(fd,"这个参数是写入的内容",function(err){
            if(!err){
                console.log("err为空,表示写入成功,但是,所有条件取反为true");
            }
            // 关闭文件
            fs.close(fd,function(err){
                if(!err){
                    console.log("文件已关闭");
                }
            });
        });
    }else{
        console.log(err);
    }
});

console.log("该语句会在第一个被输出,因为上面的操作是一个异步函数,会在异步队列中");

3.简单写入

/*
    简单文件写入,这里就是省略了open打开文件和close关闭文件
    fs.writeFile(file,data,[options],callback) //这个是异步的
    fs.writeFileSync(file,data,[options]) //这个是同步的
        参数1,file 要操作的文件的路径
        参数2,data 要写入的数据
        参数3,options 可选可不选,可以对写入进行一些设置,该参数是个对象类型
            flag
                r 只读
                w 可写
                a 追加
        参数4,callback 异步的回调函数,当写入完成以后执行的函数
 */
//引入fs模块
var fs = require("fs");
// 异步写入
fs.writeFile("hello3.txt","这个是通过writeFile写入的内容",{flag:"w"},function(err){
    if (!err){
        console.log("写入成功");
    }else{
        console.log(err);
    }
});

4.流式写入

/*
    同步,异步,简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
 */
// 引入系统文件模块哦
var fs = require("fs");
// 流式文件写入
// 创建一个可写流
/*
    fs.createWriteStream(path,[options])
        该方法可以用来创建一个可写流
        参数1,path 要写入到的文件的路径
        参数2,配置的参数
 */
var ws = fs.createWriteStream("hello4.txt");
// 可以通过监听流的open和close事件来监听流的打开和关闭
/*
    方法一on()方法
        on(事件字符串,回调函数)
            可以为对象绑定一个事件

    方法二once()方法
        once(事件字符串,回调函数)
            可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效
 */
ws.once('open',function(){
    console.log("流打开了");
});
ws.once("close",function(){
    console.log("流关闭了");
});

// 通过ws向文件中写入内容,通过ws/流的write方法
ws.write("我是小爱同学");
ws.write("我是小名同学");
ws.write("我是小红同学");

// 关闭流
//  方法一
//ws.close();
// 方法二
ws.end();

读取文件

1.同步读取
2.异步读取
3.简单读取

/*
    1,同步文件读取
    2,异步文件读取
    3,简单文件读取
        fs.readFile(path,[options],callback)
        fs.readFile(path,[options])
            参数1,path 要读取的文件路径
            参数2,options  读取的选项
            参数3,callback  回调函数,通过回调函数将读取到内容返回(err,data)参数中
                err 错误对象
                data 读取到的数据,会返回一个Buffer缓冲区,里面都是二进制的数据
       4流式文件读取


 */
// 引入系统文件模块
var fs = require("fs");

fs.readFile("41.png",(err,data)=>{
    if(!err){
        console.log(data);
        //将data写入到文件中
        fs.writeFile("520.png",data,function(err){
            if(!err){
                console.log('文件写入成功');
            }
        })
    }
});

4.流式读取

/*
    流式文件读取也适用于一些较大的文件,可以分多次将文件读取到内存中
 */
//引入文件系统模块
var fs = require("fs");
// 创建一个可读流
var rs = fs.createReadStream("41.png");
// 创建一个可写流
var ws = fs.createWriteStream("88.png");

// 监听流的开启和关闭
rs.once("open",()=>{
    console.log("可读流打开了~~");
});
rs.once("close",()=>{
    console.log("可读流关闭了~~");
    //数据读取完毕关闭可写流
   // ws.end();
});

ws.once("open",()=>{
    console.log("可写流打开了~~");
});
ws.once("close",()=>{
    console.log("可写流关闭了~~");

});
/*
// 如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,他会自动开始读取数据
rs.on("data",function(data){
    console.log(data);
})

 */

// pipe()方法可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);
	- 方法
		- 打开文件
			fs.open(path, flags[, mode], callback)
			fs.openSync(path, flags[, mode])
			
		- 读写文件
			fs.write(fd, string[, position[, encoding]], callback)
			fs.writeSync(fd, string[, position[, encoding]])
			
			fs.read(fd, buffer, offset, length, position, callback)
			fs.readSync(fd, buffer, offset, length, position)
			
		- 关闭文件
			fs.close(fd,callback)
			fs.closeSync(fd);
			
		- 简单文件读取和写入
			fs.writeFile(file, data[, options], callback)
			fs.writeFileSync(file, data[, options])
			
			fs.readFile(path[, options], callback)
			fs.readFileSync(path[, options])
			
			
		- 流式文件读取和写入
			- 流式读取和写入适用于一些比较大的文件
				fs.createWriteStream(path[, options])
				fs.createReadStream(path[, options])

http模块 node自带的一个模块,可以用来创建一个前端web服务器

// 创建一个服务器
/*
    第一步,导入http模块
    
*/
// 导入http模块
const http = require('http');
// 导入fs模块
const fs = require('fs');
const {
    count
} = require('console');
// 引入自定义模块
const common = require('./module/common.js');
// 导入path 模块
const path = require('path');
// 导入url模块
const url = require('url');

http.createServer(function (req, res) {
    // res.writeHead(200, { 'Content-Type': 'text/html;charset="urf-8"' }); //设置请求头
    // res.write('<head><meta charset="UTF-8"></head>'); //这行代码用来解决乱码
    // 1,获取用户输入的地址

    let pathname = url.parse(req.url).pathname;
    console.log(req.url);
    console.log(pathname);
    console.log(typeof pathname);
    //path.extname(); // 该方法可以获取到请求地址文件的后缀名
    pathname = pathname == '/' ? '/index.html' : pathname;
    let extname = path.extname(pathname);



    // 2,通过fs模块读取文件
    // 先判断请求的是哪个
    if (pathname != '/favicon.ico') {
        //表示请求的是首页


        fs.readFile(('./static' + pathname), async (err, data) => {
            if (err) {
                res.writeHead(404, {
                    'Content-Type': 'text/html;charset="urf-8"'
                }); //设置请求头
                res.end('404这个页面不存在');
                return;
            }
            let mime = await common.getFileMime(extname);
            res.writeHead(200, {
                'Content-Type': '' + mime + ';charset="urf-8"'
            }); //设置请求头
            // res.write(data); // 将读取到的数据响应给浏览器页面
            res.end(data); // 结束响应


        })
        // res.write('<head><meta charset="UTF-8"></head>'); //这行代码用来解决乱码

        // res.write('小爱是你吗','utf8')
        // res.end();
    }


}).listen(3000);

console.log('Server running at http://127.0.0.1:3000/');
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小艾同学呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值