1.global全局模块
浏览器:在window中有一个全局的变量window
node:在node中,也有一个全局的变量就是global,所有的全局的属性都保存在这个变量中,所以每次使用的时候,都要引用一次,就可以使用了
在global的所有的属性和方法,全局的任何地方都可以使用
console 打印
setInterval(); 定时器
setTimeout(); 延时器
clearInterval(); 清除定时器
clearTimeout(); 清除定时器
获取文件的路径(不包含文件名称),所获取的路径为绝对路径
__dirname
console.log('__dirname: --', __dirname);
获取文件的完整的路径(包含文件名),所获取的路径为绝对路径
__filename
console.log('__filename: --', __filename);
2.fs模块
fs 模块不是全局模块,不能直接使用,必须要先引用才能使用
引入fs文件
const fs = require('fs');
读取文件
语法:fs.readFile(路径,[编码],function(err,data){
err:错误信息
data:成功读取时,文件的内容
});
作用:通过fs.readFile的方法,可以读取文件
特点:fs.readFile读取文件时,返回的是一个butter对象,是一个二进制存储数据的数组
butter转成字符串 butter数据.toString()
//使用butter.toString()
// fs.readFile读取文件 会得到要给butter对象,是一个二进制存储数据一个数组,
// buffer转成字符串 toString();
// fs.readFile('./data.txt', (err, data) => {
// if (err) {
// console.log('读取失败', err);
// return;
// }
// console.log(data.toString());
// })
//使用utf-8格式转换
fs.readFile('./data.txt', 'utf-8', (err, data) => {
if (err) {
return console.log('读取失败', err);
}
console.log(data);
})
写文件
语法:fs.writeFile(路径,内容,[编码],function(err,data){
err:错误信息
data:成功读取时,文件的内容
});
作用:通过fs.writeFile可以将往指定路径下的文件,写入内容
注意点:
1.如果文件不存在,会先创建文件,再往文件中写入内容
2.如果当前文件有内容,那么使用这个方法,会将之前的内容覆盖了
// fs 写文件方法
// fs.writeFile(路径, 内容, [编码], function(err) { });
// 注意点:
// 写入内容会覆盖掉之前的内容
// 1-引入fs模块
const fs = require('fs');
// 2-写文件
fs.writeFile('./date.txt', '燃烧我的卡路里', (err) => {
if (err) {
return console.log('写入失败', err);
}
console.log('写入成功');
});
追加内容
语法:fs.appendFile(路径, 内容, [编码], function (err) { ... });
特点:
1.如果文件不存在,会先创建文件,再往文件中写入内容
2.不会覆盖之前的内容,在之前的内容的后面添加当前追加的数据
// 1- 引入 fs模块
const fs = require('fs');
// 追加 :
fs.appendFile('./data1.txt', '\n简单点,说话的方式简单点', (err) => {
if (err) {
return console.log('追加失败', err);
}
console.log('追加成功');
});
其他的方法
重命名
语法:fs.rename(路径, 新的文件名, 事件回调函数);
fs.rename('./data1.txt', 'aabbcc.txt', (err) => { });
//重命名
fs.rename('./data1.txt', 'aabbcc.txt', (err) => { });
删除
语法:fs.unlink(文件路径, 回调函数);
fs.unlink('aabbcc.txt', (err) => { });
//删除
fs.unlink('aabbcc.txt', (err) => { });
其他api(了解)
方法有很多,但是用起来都非常的简单,学会查文档
文档:http://nodejs.cn/api/fs.html
方法名 | 描述 |
---|---|
fs.readFile(path, callback) |
读取文件内容(异步) |
fs.readFileSync(path) |
读取文件内容(同步) |
fs.writeFile(path, data, callback) |
写入文件内容(异步) |
fs.writeFileSync(path, data) |
写入文件内容(同步) |
fs.appendFile(path, data, callback) |
追加文件内容(异步) |
fs.appendFileSync(path, data) |
追加文件内容(同步) |
fs.rename(oldPath, newPath, callback) |
重命名文件(异步) |
fs.renameSync(oldPath, newPath) |
重命名文件(同步) |
fs.unlink(path, callback) |
删除文件(异步) |
fs.unlinkSync(path) |
删除文件(同步) |
fs.mkdir(path, mode, callback) |
创建文件夹(异步) |
fs.mkdirSync(path, mode) |
创建文件夹(同步) |
fs.rmdir(path, callback) |
删除文件夹(异步) |
fs.rmdirSync(path) |
删除文件夹(同步) |
fs.readdir(path, option, callback) |
读取文件夹内容(异步) |
fs.readdirSync(path, option) |
读取文件夹内容(同步) |
fs.stat(path, callback) |
查看文件状态(异步) |
fs.statSync(path) |
查看文件状态(同步) |
同步和异步
异步读取文件,不会按照js的执行顺序自上而下执行,异步执行读取操作,不会影响其他的代码执行
同步获取文件,按照js的执行顺序,自上而下执行,如果读取文件操作后面还有要执行的代码,只有等文件读取完成,后面的代码才会执行,否则始终处于等待状态
总结:同步会阻塞代码的执行,异步不会阻塞代码的执行,所以在平常的工作中,虽然同步操作比较简单,但是会影响性能,尽量使用异步方式
const fs = require('fs');
// 异步读取文件
// console.log(11111);
// fs.readFile('./data.txt', 'utf-8', (err, data) => {
// console.log(data);
// });
// console.log(2222);
//同步读取文件
console.log(11111);
// let str = fs.readFileSync('./data.txt', 'utf-8');
console.log(fs.readFileSync('./data.txt', 'utf-8'));
console.log(2222);
文件路径问题
读取date.txt中数据
注意:
fs模块在操作文件是,如果写相对路径, 相对路径是相对于 node命令执行的位置,而不是相对js文件的位置 ;
解决方案:
- 在操作文件时候,不推荐使用相对路径,如果位置变了,路径就不一样 ,推荐使用绝对路径来解决
- 使用path模块解决
//使用__dirname,绝对路径解决访问不到文件
fs.readFile(__dirname + '/data/test/aa.txt', 'utf-8', (err, data) => {
if (err) {
return console.log(err);
}
console.log(data);
});
使用绝对定位字符串拼接问题:
在window系统下。使用正反 / 都能执行,但是在其他的系统中,例如linux系统下,不能解析反/,所以考虑到系统的兼容性,使用path.join()方法处理一下
console.log(path.join(__dirname, '../../', 'bb.html'));
3.path模块
为什么要使用path模块?
由于在不同操作系统中,路径分隔符 也不一样
window \
/其他操作系统 /
所以我们之间用 字符串拼接的话, 不能实现操作系统之间兼容 ,为了解决这个问题 node 提供 path模块
引入path
const path = require('path');
join方法
语法:path.join('文件路径')
功能:path.join(); 根据不同的操作系统拼接处不同的路径分隔符 , 以实现兼容
const fs = require('fs');
const path = require('path');
fs.readFile(path.join(__dirname, './data.txt'), 'utf-8', (err, data) => {
console.log(data);
});
path其他的方法
path.basename(path[, ext]) 返回文件的最后一部分
path.dirname(path) 返回路径的目录名
path.extname(path) 获取路径的扩展名
const path = require('path');
let str = 'D:\\飞秋文件\\feiq\\Recv Files\\前端-web资料\\15-班级随机点名.html';
console.log(path.basename(str));
console.log(path.dirname(str));
console.log(path.extname(str));
path模块其他api(了解)
方法名 | 描述 |
---|---|
path.basename(path[, ext]) |
返回文件的最后一部分 |
path.dirname(path) |
返回路径的目录名 |
path.extname(path) |
获取路径的扩展名 |
path.isAbsolute(path) |
判断目录是否是绝对路径 |
path.join([...paths]) |
将所有的path片段拼接成一个规范的路径 |
path.normalize(path) |
规范化路径 |
path.parse(path) |
将一个路径解析成一个path对象 |
path.format(pathObj) |
讲一个path对象解析成一个规范的路径 |
4.http模块
功能:用于处理http请求模块
在node中没有现成的服务器,需要用代码去创建服务器, 我们可以使用http模块来创建服务器
注意点:
- 给服务器注册request事件,只要服务器接收到了客户端的请求,就会触发request事件
- request事件有两个参数,request表示请求对象,可以获取所有与请求相关的信息,response是响应对象,可以获取所有与响应相关的信息。
- 服务器监听的端口范围为:1-65535之间,推荐使用3000以上的端口,因为3000以下的端口一般留给系统使用
创建/开启服务器
开启服务器的步骤:
1.引入http模块
const http = require('http');
2.创建服务器
const server = http.createServer();
3.绑定事件处理请求
server.on('request', function (req, res) {}
4.设置端口,开启服务器
server.listen(9端口号, () => { console.log('服务器已启动'); });
//4. 启动服务器,监听某个端口
//server.listen(9999, function(){
// console.log("服务器启动成功了, 请访问: http://localhost:9999");
//});
server.listen(9999, () => { console.log('服务器已启动,请访问: http://localhost:9999'); });
// 1-引入http模块
const http = require('http');
// 2-创建服务器
const server = http.createServer();
// 3-绑定事件处理请求
server.on('request', function (req, res) {
console.log('已监听到有请求发送过来了');
// req 是请求报文对象
// req 用于获取 请求报文信息的
// res 是响应报文对象
// res 用于设置响应报文数据
//处理请求
res.write('aaa');
res.end();//告诉浏览器服务器响应结束
})
// 4-设置端口,开启服务器
server.listen(9999, () => { console.log('服务器已启动'); });
req的详解
功能:获取 req 请求报文的数据
req.url 请求地址
console.log(req.url);
req.method 请求方式
console.log(req.method);
req.headers 请求头
console.log(req.headers);
// 1-引入http模块
const http = require('http');
// 2-创建服务器
const server = http.createServer();
// 3-绑定事件监听请求,处理请求
server.on('request', (req, res) => {
//获取 req 请求报文的数据
// req.url 请求地址
// req.method 请求方式
// req.headers 请求头
console.log(req.url);
console.log(req.method);
console.log(req.headers);
//设置请求结束标志
res.end('aaa');
});
// 4-设置端口,开启服务器
server.listen(9999, () => console.log('http://localhost:9999 服务器已启动') );
res的详解
功能:res 用于设置响应报文的数据
1-状态行:状态码 状态文本
res.statusCode = 404;
res.statusMessage = 'aaa';
2-响应头:
header('content-type', 'text/html;charset=utf-8')
3-响应主体:
res.write('苍茫的天涯是我的爱');
合写的方式:
res.writeHead(状态码(数字),‘状态描述(字符串,不能包含中文)’,{
请求体(对象)
});
const http = require('http'); //引入http模块
const server = http.createServer(); //创建服务器
// 绑定事件,监听 处理请求
server.on('request', (req, res) => {
//req 可以获取请求报文的数据
// console.log(req.url);
// console.log(req.method);
// res 用于设置响应报文的数据
// 1-状态行:状态码 状态文本
// res.statusCode = 404;
// res.statusMessage = 'aaa';
// res.statusMessage = '没找到';
// 2-响应头:
// res.setHeader('aaa', 'bbb');
// header('content-type', 'text/html;charset=utf-8')
// res.setHeader('content-type', 'text/css;charset=utf-8');
res.setHeader('content-type', 'text/html;charset=utf-8');
// res.writeHead(404, 'bbb', {
// ccc: 'ddd',
// 'content-type': 'text/html;charset=utf-8'
// });
// 响应头
// res.setHeader('content-type', 'text/css;charset=utf-8');
// 3-响应主体:
res.write('苍茫的天涯是我的爱');
res.end('<h1>总有刁民想朕</h1>');
});
//设置端口,开启服务器
server.listen(9999, () => console.log('http://localhost:9999 服务器已启动'));
响应给浏览器的结束标志
res.end('<h1>总有刁民想朕</h1>');
根据不同的请求,响应不同的内容
功能:根据不同的请求 做出不同的响应
判断req.url 属性的值,返回对应的内容
console.log(req.url)
switch (req.url) {
case '/index':
case '/':
res.end('进入主页');
case '/login':
res.end('进入登录页');
case '/list':
res.end('进入商品页');
case '/cart':
res.end('购物车页面');
default:
res.end('丢失页面');
}