1. 文件操作
流式写入 createWriteStream
流式操作和我们之前的哪三种写入方式都不同 其他三种方式(同步写入,异步写入,简单写入)虽然很常用
但是在某些特定的时候无法使用 以为容易造成数据泄露
在大批量文件写入操作的时候 前三种方式都不适合 流失操作 虽然使用的不是很多 但是适合大批量文件写入操作
在使用的时候 我们首先应该创建一个可写的流
使用createWriteStream创建一个可写的流 内置两个参数
第一个参数是文件的路径 先确定写入的谁
第二个参数是一个描述 打开文件的方式 和字符集 但是打开文件的方式中的键和简单写入的键不一样
写入方式我们一般选择使用a 追加写入
然后使用事件驱动进行触发流式操作
open事件 : 打开一个可写的流
close事件 : 关闭一个可写的流
最后 使用end方法 结束流式操作
const fs = require('fs');
// 流式操作
// 创建一个可写的流 打开流文件
// 第一个参数是路径 第二个参数是描述
let ws = fs.createWriteStream('./file/stream.txt',{
encoding : 'utf-8',flags : 'a'});
// 使用事件驱动 打开一个可写的流
ws.on('open',()=>{
console.log('流打开了');
});
// 使用ws中的write方法进行写入 可以大批量的写入
// ws.write('我打开话费卡刷的卡');
for (let i = 1; i < 100000; i++){
ws.write(`今天我是第${
i}次想你了\n`);
}
// 使用事件驱动 关闭可写的流
ws.on('close',()=>{
console.log('流关闭了');
})
// 使用end方法结束流操作
ws.end();
读取文件夹 readdir
使用readfile方法进行读取文件夹 内置两个参数
第一个参数是文件夹的路径
第二个参数是回调函数
回调内置两个参数
第一个参数是错误
第二个参数是读取出来文件夹的结果 结果是文件夹内部的文件名和文件夹名组成的一个数组
const fs = require('fs');
/*
使用readfile方法进行读物文件夹 内置两个参数
第一个参数是文件夹的路径
第二个参数是回调函数
回调内置两个参数
第一个参数是错误
第二个参数是读取出来文件夹的结果 结果是文件夹内部的文件名和文件夹名组成的一个数组
*/
fs.readdir('./file',(error,data)=>{
if (error) console.log('读取失败');
else console.log(data);
})
let result = fs.readdirSync('./file');
console.log(result);
读取文件或文件夹的信息 stat
使用stat方法进行读取文件或者文件夹 内置两个参数
第一个参数是文件或者文件夹的路径
第二个参数是回调函数
回调内置两个参数
第一个参数是错误
第二个参数是读取出来文件或者文件夹的结果 返回一个对象
const fs = require('fs');
/*
使用stat方法进行读取文件或者文件夹 内置两个参数
第一个参数是文件或者文件夹的路径
第二个参数是回调函数
回调内置两个参数
第一个参数是错误
第二个参数是读取出来文件或者文件夹的结果 返回一个对象
*/
fs.stat('./file/stream.txt',(error,data)=>{
if (error) console.log(error);
else console.log(data);
})
let result = fs.statSync('./file/');
console.log(result);
创建文件夹 mkdir
使用nkdir方法创建一个文件夹
内置两个参数
第一个参数是创建文件夹的路径和文件夹名
第二个参数是回调函数
回调内置一个参数 参数是错误
虽然文件夹可以创建成功 但是我们不能层级创建
层级创建文件夹 会创建失败
如果想要层级创建需要加上一个参数 也就是说 内置三个参数
第一个参数还是路径
第二个参数是是否递归创建 是一个对象
第三个参数还是回调 回调的参数也是错误
const fs = require('fs');
/*
使用nkdir方法创建一个文件夹
内置两个参数
第一个参数是创建文件夹的路径和文件夹名
第二个参数是回调函数
回调内置一个参数 参数是错误
*/
// fs.mkdir('./file/bb',error=>{
// if (error) console.log(error);
// else console.log('创建成功');
// })
// fs.mkdirSync('./file/cc')
// 层级创建
fs.mkdir('./file/dd/ee/ff/gg/hh',{
recursive : true},error=>{
if (error) console.log(error);
else console.log('创建成功');
})
删除文件夹 rmdir
删除文件夹使用rmdir方法 内置两个或者三个参数
第一个参数是删除的目录
第二个参数是是否递归删除 因为不能删除非空目录 那么加上这个参数 如果递归删除 可以删除非空目录 参数可选
第三个参数是回调函数 回调内置一个参数 参数是错误
const fs = require('fs');
/*
删除文件夹使用rmdir方法 内置两个或者三个参数
第一个参数是删除的目录
第二个参数是是否递归删除 因为不能删除非空目录 那么加上这个参数 如果递归删除 可以删除非空目录 参数可选
第三个参数是回调函数 回调内置一个参数 参数是错误
*/
// fs.rmdir('./file/dd',error=>{
// if (error) console.log(error);
// else console.log('删除成功');
// })
// fs.rmdirSync('./file/dd');
// 传递第二个参数 删除目录
fs.rmdir('./file/dd',{
recursive : true},error=>{
if (error) console.log(error);
else console.log('删除成功');
})
删除文件 unlink
删除文件使用unlink方法
内置两个参数
第一个参数是删除的文件路径
第二个参数是回调函数
回调内置一个参数 参数是错误
const fs = require('fs');
/*
删除文件使用unlink方法
内置两个参数
第一个参数是删除的文件路径
第二个参数是回调函数
回调内置一个参数 参数是错误
*/
// fs.unlink('./file/1.jpg',err=>{
// err ? console.log('删除失败') : console.log('删除成功');
// })
fs.unlinkSync('./file/test.txt');
文件重命名 rename
对文件进行重命名或者移动文件 也可以两者并行
内置三个参数
第一个参数是文件原路径 + 原文件名
第二个参数是文件的新路径 + 新文件名
第三个参数是回调函数 内置一个参数 参数是错误
const fs = require('fs');
/*
对文件进行重命名或者移动文件 也可以两者并行
内置三个参数
第一个参数是文件原路径 + 原文件名
第二个参数是文件的新路径 + 新文件名
第三个参数是回调函数 内置一个参数 参数是错误
*/
// fs.rename('./file/bu.jpg','./biu.jpg',err=>{
// if (err) console.log('移动失败');
// else console.log('移动成功');
// })
fs.renameSync('./biu.jpg','./file/biubiubiu.jpg');
2. 网络基础
域名
域名(英语:Domain Name),又称网域
是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称
用于在数据传输时对计算机的定位标识
由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点
人们设计出了域名,并通过网域名称系统来将域名和IP地址相互映射
使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串
IP地址
概念
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议
设计IP的目的是提高网络的可扩展性
解决互联网问题,实现大规模、异构网络的互联互通
分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展
根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务
分类
A类:(1.0.0.0-126.0.0.0)
第一个字节为网络号,后三个字节为主机号
该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络
B类:(128.0.0.0-191.255.0.0)
前两个字节为网络号,后两个字节为主机号
该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络
C类:(192.0.0.0-223.255.255.0)
前三个字节为网络号,最后一个字节为主机号
类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络
D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户
E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间
端口
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口
端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见
例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口
计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴
http协议
概念
超文本传输协议
http是一个简单的请求-响应协议,它通常运行在TCP之上
它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应
请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式
而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣
因为它使得开发和部署是那么的直截了当
请求
是指从客户端到服务器端的请求消息
包括:消息首行中,对资源的请求方法、资源的标识符及使用的协议
响应
HTTP状态码(HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码
它由 RFC 2616 规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 与 RFC 4918 等规范扩展
所有状态码的第一个数字代表了响应的五种状态之一
所示的消息短语是典型的,但是可以提供任何可读取的替代方案
响应码分类
1xx:指示信息—表示请求已接收,继续处理
2xx:成功—表示请求已经被成功接收、理解、接受
3xx:重定向—要完成请求必须进行更进一步的操作
4xx:客户端错误—请求有语法错误或请求无法实现
5xx:服务器端错误—服务器未能实现合法的请求
常见响应码
200: 客户端请求, 和服务器成功做出响应
301: 重定向, 资源被重定向到一个永久性的地址上, 资源的原始url可能无法访问
302: 重定向, 资源被重定向到一个临时性的地址上, 资源的原始url还在
400: 语义错误, 无法被服务器理解, 请求参数有误
401: 请求需要用户验证, 包含了 Authorization 证书, 但是被服务器拒绝了
403: 服务器已经理解请求, 但是拒绝执行它
404: 请求url不存在 (一般常见于请求路径拼写错误)
500: 服务器遇到了一个未曾预料的请求, 一般出现在后台代码报错
502: 网关或者代理服务器请求时, 从服务器接收到了一个无效响应
503: 服务器过载, 当前无法完成响应, 拒绝客户端连接
504: 网关或者代理服务器请求时, 等待响应超时了
MIME
概念
MIME的全称是Multipurpose Internet Mail Extensions,即多用途互联网邮件扩展类型
这是HTTP协议中用来定义文档性质及格式的标准
服务器通过MIME告知响应内容类型,而浏览器则通过MIME类型来确定如何处理文档
常见MIME类型
application/octet-stream?未知的应用程序文件
application/json : json数据
text/plain : 未知的文本文件(纯文本文件),浏览器会认为这是可以直接显示的
text/css : css文件
text/html : HTML文件
image/gif : gif文件
3. Web服务器
创建Web服务器
Web服务器 服务器的概念我已经解释过了 不再说了
我们现在说NodeJS可以使用js做后台应用 主要的原因是比JS中多了一个文件流操作和服务器
那么 如果说我们想使用后台应用 必须创建一个服务器
在NodeJS中 我们可以使用http核心模块创建一个Web服务器
使用http模块中的createServer方法创建一个Web服务器
内置一个参数 参数是回调函数
回调内置两个参数 第一个参数是请求 第二个参数是响应
返回值是一个服务器对象
创建之后使用listen方法进行监听 监听服务器端口
响应对象
writeHead : 响应头信息
内置两个参数 第一个参数是响应码 第二个参数是一个对象 对象中的键值对是MIME和字符集
write : 响应内容
内置一个参数 参数是响应的数据
end : 结束响应
每一个服务器接口中 必须有end 如果没有end 无法响应成功
其中end方法中可以携带一个参数 参数是响应的数据 但是响应的数据必须是字符串 不能是数字
const http = require('http');
/*
使用模块中的createServer方法进行创建服务器
内置一个参数 参数是回调函数
回调内置两个参数 第一个参数是请求 第二个参数是响应
返回值是一个服务器对象
*/
let server = http.createServer((request,response)=>{
// 做一个简单的响应 响应头信息
response.writeHead(200,{
"Content-type":"text/html;charset=utf-8"});
// response.writeHead(200,{"Content-type":"text/plain;charset=utf-8"});
// 响应的内容
// response.write('<h1>你好 成都</h1>');
// 结束响应
// response.end('疫情终结者');
// response.end('疫情催化剂—Eric');
response.end('疫情终结者—钟南山');
})
/*
创建之后使用listen方法进行监听 监听服务器端口
listen方法内置三个参数
第一个参数是端口号 服务器的端口号
第二个参数是IP地址或者是域名 输入IP地址必须和你自己的电脑有关 可选参数
或者是你的局域网IP地址
或者是你的本地地址 127.0.0.1
或者是本地域名 localhost
默认是127.0.0.1
第三个参数是回调函数 可选参数
*/
server.listen(3000,'127.0.0.1',()=>{
console.log('服务器正在运行......');
})
请求对象
url属性 : 他是我们请求路由(暂时可以称之为路径)
const http = require('http');
http.createServer((req,res)=>{
// 1.尝试使用请求对象
if (req.url == '/favicon.ico'){
return false;
}
console.log(req.url);
res.end('已响应');
}).listen(3000,'127.0.0.1',()=>{
console.log('Server Running......');
})
4.路由
路由
路由 : 其实就是请求的路径 在浏览器端地址栏中的路径 就是我们说的路由
首先 我们要理解URL是什么 统一资源定位器
URL粗略上来分是三部分 : 协议 域名 路径
详细上来分是六部分 : 协议 域名 端口 路径 参数 锚点
在URl中 我们请求的路径 在浏览器的地址栏中的路径 就是我们所说的路由
我们使用的请求对象中的url属性 获取出来的就是路由 + 参数
path模块
basename : 获取路径最后一部分
// basename : 获取路径中的最后一部分
// 最后请求的页面和参数
console.log(path.basename(str1));
console.log(path.basename(str2));
dirname : 获取路径中文件夹部分
// dirname : 获取路径中的文件夹部分
// 和basename组成一个完整的URL
console.log(path.dirname(str1));
console.log(path.dirname(str2));
extname : 获取路径中文件扩展名
// extname : 获取文件后缀名
// 他只是取出最后一个.后面所有的内容 包括这个.
console.log(path.extname(str1));
console.log(path.extname(str2));
parse : 格式化路径, 获取每一部分的值
// parse : 格式化路径, 获取每一部分的值
// 获取上面三个部分的值 加上文件名 返回的是一个对象
console.log(path.parse(str1));
console.log(path.parse(str2));
resolve : 连接路径 绝对路径
// resolve : 连接路径
console.log(path.resolve('/a','b','c'));
console.log(path.resolve(__dirname,'a','b','c'));
console.log(path.resolve(__dirname,'a','../b','c'));
join : 连接路径 相对路径
// join : 连接路径
console.log(path.join(__dirname,'/a','b','c'));
console.log(path.join('/a','b','c'));
__dirname : 获取当前文件夹 绝对路径
__filename : 获取当前文件的绝对路径
// __dirname : 获取当前文件夹 绝对路径
console.log(__dirname);
// __filename : 获取当前文件的绝对路径
console.log(__filename);
URL模块
我们使用url模块 只使用其中的一个方法 parse方法
它内置一个参数 参数是url地址 他可以将url转化为对象格式
案例:渲染网站 运行在服务器端