一.node中的模块引入
1.模块的基本导入导出
//one.js
//导出模块方式1
module.exports ={
a:10,
b:20,
c:function(){
console.log('我是c函数')
}
}
//index.js
//引入模块: 注意要带./因为是服务器运行了
var one = require('./one');
console.log(one);
console.log(one.a);
console.log(one.b);
one.c();
console.log('----------');
2.四种模块导出写法
//1.综合写法
module.exports ={
a:10,
b:20,
c:function(){
console.log('我是c函数')
}
}
//2.单独写法
module.exports.a = 10;
module.exports.b = 20;
module.exports.c = function(){
console.log('c函数');
}
// 3.拆分写法
var a = 10;
var b = 20;
var c = function(){
console.log('我是c函数');
}
module.exports={
a,b,c
}
//4.exports简写
exports.a = 10;
exports.b = 20;
exports.c = function(){
console.log('c函数')
}
//注意: exports不能直接导出对象, 拿不到对象的值
exports跟module.exports是指向同一个对象,
//这种写法是错误的
exports ={
a:10,
b:20,
c:function(){
console.log('我是c函数')
}
}
3.module.exports 和exports的关系
为了方便,Node
为每个模块提供一个exports
变量,指向module.exports
。这等同在每个模块头部,有一行这样的命令。
var exports = module.exports;
其结果是,在对外输出模块接口时,我们可以直接在 exports
对象上添加方法, 如同在module.exports
上添加一样。
注意:因为 Node
模块是通过 module.exports
导出的,如果直接将exports
变量指向一个值,就切断了exports
与module.exports
的联系,导致意外发生。
var exports = module.exports;
//两个是相等的关系,但又不是绝对相当的关系
/*
例如:
1.module.exports可以直接导出一个匿名函数或者一个值
*/
module.exports=function(){
var a="Hello World"
return a;
}
//但是exports是不可以的,因为这样等于切断了exports与module.exports的联系,exports不再指向module.exports了。
参考文档: module.exports与exports,export与export default之间的关系和区别
4.require引入包的顺序
require('./one')
1.内置模块(node的)
2.文件模块(插件当前文件)
3.文件目录模块(没有对应的文件,就找对象的目录)
4.node_modules模块(先本地,后全局)
更多参考:CommonJS规范
二.nodemon热重载工具
nodemon 也是热部署工具
作用: 自动检测程序的变化,不需要你自己每次修改一点就重启服务器
npm i nodemon -g
nodemon js文件
不需要重启服务器,直接刷新网页就可以了
三.http模块
注意: http
模块是node自带的模块,不需要下载,直接引用就可以了http
模块是用来创建服务器的
http.createServer(function(req,res){}) //http模块的createServer方法,会返回一个服务器对象
server.listen(端口); //服务器对象,调用listen方法来监听端口
res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); //响应头
res.write(); //返回数据内容,也必须使用res.end结束,不然一直请求
res.end(); //结束返回(可以包含res.write)----建议使用
req.url //可以获得用户请求的网址路径
req.method //获得用户请求的方法
node的http模块主要使用来创建服务器的.
1. 引入http模块
2. 创建服务器(req和res表示请求和响应对象)
3. 监听端口
//注意: 端口一般大于3000就可以,系统用了一部分,只要不冲突就行了
//1.引入模块
const http = require('http');
//2.创建服务器,接收请求和响应
let server = http.createServer(function(req,res){
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" })
// res.end('返回的内容')
res.write('返回的内容')
res.end();
})
//3.监听端口
server.listen(3000,function(){
console.log('服务器已经开启');
});
//注意,修改服务器代码之后,一定要重启服务器,才能生效
//注意: req.url可以拿到用户请求的网址
//注意:res.end() 相当于: res.write()和res.end();
res.write()写入数据,多个会连接成一个
1.url模块
//url模块用来将请求地址,转换为对象
url.parse(路径,参数是否为对象); //默认为false字符串,一般设置为true对象
例如:http://127.0.0.1:3000/login?username=zhangsan&password=123456
//true表示返回一个对象,false表示还是一个字符串, 返回一个对象,其中query中放着参数
let urlObj=url.parse(请求路径,true); //将参数包装成对象,第二个参数为ture,参数变为对象
urlObj.query.username //获得用户名
urlObj.query.password //获得密码
//参考代码
const http = require('http');
const url = require('url')
let server = http.createServer(function(req,res){
//设置响应格式
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" })
if(req.url == '/favicon.ico') return;
//将url请求字符串,转换为对象
console.log(req.url);
//将网址转换为对象
var urlObj = url.parse(req.url,true);
console.log(urlObj.query.username)
res.end('返回的数据');
})
server.listen(3000,function(){
console.log('服务器启动了');
})
注意:每次修改服务器内容代码,就需要重启
2.node处理get请求
get 请求的参数在网址中: http://127.0.0.1:3000/login?username=zhangsan&password=123456
const http = require('http');
const url = require('url');
let server = http.createServer(function(req,res){
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" });
if(req.url == '/favicon.ico') return;
console.log(req.url);
//将请求参数转换为对象
let params = url.parse(req.url,true);
//得到参数对象
console.log(params.query);
res.end('得到数据了'+req.url);
})
server.listen(3000,function(){
console.log('服务器启动了');
})
3.node处理post请求
//post请求的数据,在请求体中,需要以文件块的方式进行接收
//获得请求数据,chunk就是一块块数据,然后拼接在一起
req.on('data',function(chunk){
})
//数据获取结束
req.on('end',function(){
//获取数据结束后,使用res.end的打印
})
// 使用postman模拟发送post数据并且,写在body中
const http = require('http');
let server = http.createServer(function(req,res){
//判断是否是post请求
if(req.method === 'POST'){
//定义变量存储数据
let postData = '';
//接收数据
req.on('data',function(chunk){
//将二进制转换为字符串
postData += chunk;
})
//接收数据完毕
req.on('end',function(){
//直接输出,不识别中文
console.log(postData);
res.end(postData);
})
}
})
server.listen(3000,function(){
console.log('服务器运行了')
})
注意: 对象转换为字符串的方法: util.inspect()
或者 JSON.stringify()
querystring.parse()
将字符串转换为对象
4.node返回JSON数据
// 根据请求,返回JSON数据。写死一个对象,然后转为JSON字符串,返回就行了
JSON.stringify()
const http = require('http');
let server = http.createServer(function(req,res){
res.writeHead(200, { "Content-Type": "text/json;charset=UTF-8" });
let user = {
name:'张三',
age:19
}
res.end(JSON.stringify(user));
})
server.listen(3000,function(){
console.log('服务器运行了')
})
四.fs模块
fs.stat 检测是文件还是目录
fs.mkdir 创建目录
fs.writeFile 创建写入文件
fs.appendFile 追加文件
fs.readFile 读取文件
fs.readdir 读取目录
fs.rename 重命名
fs.rmdir 删除目录
fs.unlink 删除文件
fs.createReadStream 从文件流中读取数据
fs.createWriteStream 写入文件流数据
管道流概念: 实现大文件传输(小文件一次性传输过去,大文件慢慢传)
1.创建文件夹
const fs = require('fs');
//第一个参数,文件夹路径和名字, 第二个参数是权限默认就可以,不写,第三个参数是错误的回调
fs.mkdir('demo', function(err) {
if (err) {
console.log('文件夹创建失败');
console.log(err);
//创建文件失败后,就不继续打印创建成功了
return false;
}
console.log('创建文件夹成功');
})
//注意: 如果demo/a 就可以创建两个文件夹 demo下有个a
2.检测文件和目录
const fs = require('fs');
//err错误信息, stats检测对象,然后可以调用
//isFile() 判断是否是文件,返回布尔类型
//isDirectory() 判断是文件夹,返回布尔类型
fs.stat('demo', function(err, stats) {
if (err) {
console.log('文件检测错误');
console.log(err);
return false;
}
console.log('文件:' + stats.isFile());
console.log('文件夹:' + stats.isDirectory());
})
3.删除目录
const fs = require('fs');
fs.rmdir('demo', function(err) {
if (err) {
console.log(err);
return false;
}
console.log('删除目录成功');
})
4.读取目录
//fs.readdir 读取目录: 会将目录下的文件和文件夹都获取到
let fs = require('fs');
//拿到一个文件夹下的所有目录: 包括文件夹和文件
fs.readdir('demo', function(err, data) {
if (err) {
console.log(err);
return false;
}
console.log(data);
})
5.创建文件
//创建文件,并写入内容
let fs = require('fs');
//第一个参数: 文件名字,没有这个文件创建,有文件覆盖
//第二个参数: 文件内容
//第三个参数: 文件编码格式
//第四个参数:错误的回调
fs.writeFile('a.txt', '用node创建的文件111', 'utf-8', function(err) {
if (err) {
console.log(err);
return false;
}
console.log('写入成功');
})
6.追加文件内容
let fs = require('fs');
//第一个参数: 文件名字,没有这个文件创建,有文件覆盖
//第二个参数: 文件内容
//第三个参数: 文件编码格式
//第四个参数:错误的回调
fs.appendFile('a.txt', '111这是追加的内容', function(err) {
if (err) {
console.log(err);
return false;
}
console.log('追加成功');
})
7.读取文件
let fs = require('fs');
//第一个参数: 文件名字,没有这个文件创建,有文件覆盖
//第二个参数:错误的回调
fs.readFile('a.txt', function(err, data) {
if (err) {
console.log(err);
return false;
}
//默认读取格式为16进制 Buffer
console.log(data);
console.log(data.toString());
})
8.删除文件
let fs = require('fs');
fs.unlink('a.1.txt', function(err) {
if (err) {
console.log(err);
return false;
}
console.log('删除文件成功');
})
9.重命名
let fs = require('fs');
//修改文件的名字
// fs.rename('c.html', 'x.html', function(err) {
// if (err) {
// console.log(err);
// return false;
// }
// console.log('修改名字成功');
// })
//也可以修改文件夹名字
// 还可以进行剪切,文件夹必须存在
fs.rename('demo/b/1.txt', './1.txt', function(err) {
if (err) {
console.log(err);
return false;
}
console.log('修改名字成功');
})
10.读取流
1.创建读取流
let readStream = fs.createReadStream('mi.jpg');
2.接收数据的回调 readStream.on('data',function(err){})
3.数据接收完毕的回调
4.错误信息的回调
//图片读取的很慢,文字读取的很快
const fs = require('fs');
//创建读取流,读取a.txt文件
let readStream = fs.createReadStream('mi.jpg');
//定义一个空字符串,用于拼接数据
let str = '';
//记录读取次数
let count = 0;
//开始读取数据
//data就是数据事件,chunk是每个数据的分片
//count表示读取多少次
readStream.on('data', function(chunk) {
str += chunk;
count++;
})
//读取完毕后
readStream.on('end', function(chunk) {
console.log(count);
// console.log(str);
})
//读取失败的处理
readStream.on('error', function(err) {
console.log(err);
})
11.写入流
1.创建写入流,会创建某个文件
let writeStream = fs.createWriteStream('str.txt');
2.写入文件,并结束
writeStream.write(str,'utf-8');
writeStream.end();
3.写入结束事件
writeStream.on('finish',function(){
console.log('写入完成');
})
const fs = require('fs');
let str = "我是从数据库获取的数据";
//创建写入流
let writeStream = fs.createWriteStream('str.txt');
//循环写入100句这个内容
for (let i = 0; i < 100; i++) {
writeStream.write(str, 'utf-8');
}
//标记写入完成
writeStream.end();
//写入完成的事件
writeStream.on('finish', function() {
console.log('写入完成');
})
//写入失败的事件
writeStream.on('error', function() {
console.log('写入失败');
})
12.管道流
文件读取: 适合小文件,直接先将文件读入内存中,然后再存起来
管道流读取: 适合大文件进行拷贝,传输,将文件分片,慢慢传输.(读取流,写入流,管道流)
fs.createReadStream() 读取文件流
fs.createWriteStream() 写入文件流
http://www.zymseo.com/node/434.html
const fs = require('fs');
//创建一个读取流
let readStream = fs.createReadStream('snow.mp3');
//创建一个写入流
let writeStream = fs.createWriteStream('mysnow.mp3');
//管道读写操作,读取snow.mp3到新创建的mysnow.mp3,实现文件拷贝
readStream.pipe(writeStream);
五.path模块
path模块提供了一些方法,用来解决路径拼接的问题(可以简单理解为字符串拼接)
路径拼接: path.join(路径1,路径2) 拼接两个路径
路径获取: path.resolve() 返回当前目录的绝对路径
获取路径:path.dirname(filepath)
获取文件名:path.basename(filename)
获取扩展名:path.extname(filepath)
//重点掌握: path.join() 和path.resovle()
//https://blog.csdn.net/NextStand/article/details/59535555
const path = require('path');
var str = path.join('demo','test');
console.log(str);
//返回当前目录的全局路径
var a = path.resolve();
console.log('本地路径'+a);
//获得当前的文件夹名字
var b = path.dirname('demo/a.txt');
console.log(b);
//获取文件名
var c = path.basename('demo/a.txt')
console.log(c);
// 获取文件的后缀名
var d = path.extname('demo/a.txt');
console.log(d);
六.全局对象模块
__filename 表示当前正在执行的脚本的文件名
__dirname 表示当前执行脚本所在的目录。
//单次和多次定时
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
clearInterval(t)
七.node中常见模块的总结
1.npm的常见命令使用
2.node的模块引入(4种,1个注意点)
3. node中的常用模块
http模块
url模块
fs文件模块
path 路径模块
global 全局模块
node是别人在js的基础上重新开发了一套api和解析器, 这样js代码就具备了上面的这些功能.但是用这些功能我们能做出东西,但是效率很低,所以有了其他的框架; 目前前端中的node开发框架有: express < koa < egg
八.node中操作mysql数据库
学mysql这种类型的第三方包,主要是看文档,能够正确的实现功能就可以了.不需要自己独立背下来.
1.下载mysql包,并引入
2. 创建连接 mysql.createConnection(数据库参数对象)---得到连接
3. 开始连接 conn.connect();
4.查询数据库 conn.query(sql语句,参数数组,回调函数)
5.结束连接 conn.end();
1.查询数据
const mysql = require('mysql');
//1.创建数据库连接
const conn =mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: '',
database: 'qd01',
port: '3306'
})
// 2.开始连接
conn.connect();
// 3.查询语句
let sql = 'select * from user';
conn.query(sql,function(err,rows){
if(err) throw err;
console.log(rows);
})
//4.结束连接
conn.end();
//返回错误的两种写法,如果数据库错误,就会报错
if(err){
console.log(err);
return false;
}
//简易写法
if(err) throw err;
2.添加数据
1.sql中使用?当占位符
2.conn.query(sql语句,参数数组,function(err,result){})
3.affectedRows受影响行数
const mysql = require('mysql');
//1.创建数据库连接
const conn =mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: '',
database: 'qd01',
port: '3306'
})
// 2.开始连接
conn.connect();
// 3.查询语句
let sql = 'insert into user(name,age,sex,tel) values(?,?,?,?)';
let params = ['任正非',29,1,'111111'];
conn.query(sql,params,function(err,result){
if(err) throw err;
console.log(result);
if(result.affectedRows>0){
console.log('插入成功')
}else{
console.log('插入失败');
}
})
//4.结束连接
conn.end();
3.删除数据
//删除,如果只有一个参数,就直接写,不用当数组
let sql = 'delete from user where id=?';
let params = 13;
conn.query(sql,params,function(err,result){
if(err) throw err;
console.log(result);
if(result.affectedRows>0){
console.log('删除成功')
}else{
console.log('删除失败');
}
})
4.修改数据
//修改
let sql = 'update user set name =? where id=?';
let params = ['曹操111',12];
conn.query(sql,params,function(err,result){
if(err) throw err;
console.log(result);
if(result.affectedRows>0){
console.log('修改成功')
}else{
console.log('修改失败');
}
})
5.数据库连接池
1.创建连接池对象mysql.createPool(配置)
2.从连接池中获得数据库连接对象 pool.getConnection()
3.查询数据库 conn.query(sql语句,参数,回调)
4.释放连接 conn.release();
query(sql语句,参数,回调函数)
参数的写法: 一个值,直接写
多个值用数组[参数1,参数2]
如果插入的数据有多个,可以用对象,但是insert语句的写法就要修改
insert into users set ?
后面就可以写对象
const mysql = require('mysql');
const dbconfig = {
host: '127.0.0.1',
user: 'root',
password: '',
database: 'qd01',
port: '3306'
}
//1.创建数据库连接池对象
const pool = mysql.createPool(dbconfig);
let sql = 'select * from user';
//获得连接对象
pool.getConnection(function(err,conn){
//查询数据
conn.query(sql,function(err,rows){
console.log(rows);
//释放连接
conn.release();
})
})
6.数据库返回到页面
const http = require('http');
const mysql = require('mysql');
//创建服务器
let server = http.createServer(function(req,res){
res.end(JSON.stringify(userDate));
})
server.listen(3000,function(){
console.log('服务器启动了')
})
let userDate = '空数据';
//数据库相关的操作
const dbconfig = {
host: '127.0.0.1',
user: 'root',
password: '',
database: 'qd01',
port: '3306'
}
//1.创建数据库连接池对象
const pool = mysql.createPool(dbconfig);
let sql = 'select * from user';
//获得连接对象
pool.getConnection(function(err,conn){
//查询数据
conn.query(sql,function(err,rows){
userDate=rows;
console.log(rows);
//释放连接
conn.release();
})
})
九.Node多进程
我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。
每个子进程总是带有三个流对象:child.stdin, child.stdout 和child.stderr。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。
Node 提供了 child_process 模块来创建子进程,方法有:
- exec - child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
- spawn - child_process.spawn 使用指定的命令行参数创建新进程。
- fork - child_process.fork 是 spawn()的特殊形式,用于在子进程中运行的模块,如 fork(‘./son.js’) 相当于 spawn(‘node’, [‘./son.js’]) 。与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信。
1.exec() 方法
child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
语法如下所示:
child_process.exec(command[, options], callback)
参数
参数说明如下:
command: 字符串, 将要运行的命令,参数使用空格隔开
options :对象,可以是:
- cwd ,字符串,子进程的当前工作目录
- env,对象 环境变量键值对
- encoding ,字符串,字符编码(默认: ‘utf8’)
- shell ,字符串,将要执行命令的 Shell(默认: 在 UNIX 中为
/bin/sh
, 在 Windows 中为cmd.exe
, Shell 应当能识别-c
开关在 UNIX 中,或/s /c
在 Windows 中。 在Windows 中,命令行解析应当能兼容cmd.exe
) - timeout,数字,超时时间(默认: 0)
- maxBuffer,数字, 在 stdout 或 stderr 中允许存在的最大缓冲(二进制),如果超出那么子进程将会被杀死 (默认: 200*1024)
- killSignal ,字符串,结束信号(默认:’SIGTERM’)
- uid,数字,设置用户进程的 ID
- gid,数字,设置进程组的 ID
callback :回调函数,包含三个参数error, stdout 和 stderr。
exec() 方法返回最大的缓冲区,并等待进程结束,一次性返回缓冲区的内容。
//support.js 文件代码:
console.log("进程 " + process.argv[2] + " 执行。" );
//master.js 文件代码:
const fs = require('fs');
const child_process = require('child_process');
for(var i=0; i<3; i++) {
var workerProcess = child_process.exec('node support.js '+i, function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: '+error.code);
console.log('Signal received: '+error.signal);
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
});
workerProcess.on('exit', function (code) {
console.log('子进程已退出,退出码 '+code);
});
}
执行以上代码,输出结果为:
$ node master.js
子进程已退出,退出码 0
stdout: 进程 1 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 0 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 2 执行。
stderr:
2.spawn() 方法
child_process.spawn 使用指定的命令行参数创建新进程,语法格式如下:
child_process.spawn(command[, args][, options])
参数
参数说明如下:
command: 将要运行的命令
args: Array 字符串参数数组
options Object
- cwd String 子进程的当前工作目录
- env Object 环境变量键值对
- stdio Array|String 子进程的 stdio 配置
- detached Boolean 这个子进程将会变成进程组的领导
- uid Number 设置用户进程的 ID
- gid Number 设置进程组的 ID
spawn() 方法返回流 (stdout & stderr),在进程返回大量数据时使用。进程一旦开始执行时 spawn() 就开始接收响应。
// support.js 文件代码:
console.log("进程 " + process.argv[2] + " 执行。" );
// master.js 文件代码:
const fs = require('fs');
const child_process = require('child_process');
for(var i=0; i<3; i++) {
var workerProcess = child_process.spawn('node', ['support.js', i]);
workerProcess.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
workerProcess.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
workerProcess.on('close', function (code) {
console.log('子进程已退出,退出码 '+code);
});
}
执行以上代码,输出结果为:
$ node master.js stdout: 进程 0 执行。
子进程已退出,退出码 0
stdout: 进程 1 执行。
子进程已退出,退出码 0
stdout: 进程 2 执行。
子进程已退出,退出码 0
3.fork 方法
child_process.fork 是 spawn() 方法的特殊形式,用于创建进程,语法格式如下:
child_process.fork(modulePath[, args][, options])
参数
参数说明如下:
modulePath: String,将要在子进程中运行的模块
args: Array 字符串参数数组
options:Object
- cwd String 子进程的当前工作目录
- env Object 环境变量键值对
- execPath String 创建子进程的可执行文件
- execArgv Array 子进程的可执行文件的字符串参数数组(默认: process.execArgv)
- silent Boolean 如果为
true
,子进程的stdin
,stdout
和stderr
将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false
) - uid Number 设置用户进程的 ID
- gid Number 设置进程组的 ID
返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。
// support.js 文件代码:
console.log("进程 " + process.argv[2] + " 执行。" );
// master.js 文件代码:
const fs = require('fs');
const child_process = require('child_process');
for(var i=0; i<3; i++) {
var worker_process = child_process.fork("support.js", [i]);
worker_process.on('close', function (code) {
console.log('子进程已退出,退出码 ' + code);
});
}
执行以上代码,输出结果为:
$ node master.js
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0
十.node的知识总结
1.npm的常见命令
npm i 包名 -g 全局安装
npm i 包名 -S 项目依赖
npm i 包名 -D 开发依赖
2.模块的导入导出
//a.js
module.exports = {//对象和方法}
//index.js
var m = require('./a.js');
console.log(m.name);
m.run();
3.热重载工具
nodemon
4.http模块
http.createServer(function(req,res){}) //http模块的createServer方法,会返回一个服务器对象
server.listen(端口); //服务器对象,调用listen方法来监听端口
res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); //响应头
res.write(); //返回数据内容
res.end(); //结束返回(可以包含res.write)----建议使用
req.url //可以获得用户请求的网址路径
5.url模块
let urlObj=url.parse(请求路径,true); //将参数包装成对象
urlObj.query.username //获得用户名
urlObj.query.password //获得密码
6.fs模块
fs.stat 检测是文件还是目录
fs.mkdir 创建目录
fs.writeFile 创建写入文件
fs.appendFile 追加文件
fs.readFile 读取文件
fs.readdir 读取目录
fs.rename 重命名
fs.rmdir 删除目录
fs.unlink 删除文件
fs.createReadStream 从文件流中读取数据
fs.createWriteStream 写入文件流数据
管道流概念: 实现大文件传输(小文件一次性传输过去,大文件慢慢传)
7.path模块
路径拼接: path.join(路径1,路径2) 拼接两个路径
路径获取: path.resolve() 返回当前目录的绝对路径
获取路径:path.dirname(filepath)
获取文件名:path.basename(filename)
获取扩展名:path.extname(filepath)
8.全局模块
__filename 表示当前正在执行的脚本的文件名
__dirname 表示当前执行脚本所在的目录。
9.node操作数据库
1.创建连接
2.开始连接
3.查询数据库
4.关闭连接