1文件系统(通过node操作系统文件)
使用文件系统要引入fs模块 fs时核心模块,直接引用不需要下载;
fs模块中所有的操作都有两种形式可以选择 同步异步
同步文件系统会阻塞程序执行,也就是除非操作完毕,否侧不会向下执行代码,
异步文件不会阻塞程序执行,而是在操作完成时通过回调函数将结果返回
2buffer(缓冲区)
buffer的结构和数组很像,操作的方法也和数组类似;是一个核心模块不需要引入模块
• 从结构上看Buffer非常像一个数组,它的元
素为16进制的两位数。
• 实际上一个元素就表示内存中的一个字节。
• 实际上Buffer中的内存不是通过JavaScript
分配的,而是在底层通过C++申请的。
• 也就是我们可以直接通过Buffer来创建内存中的空间。
在buffer中存储的都是二进制文件.但是在显示的时候是以16进制显示的;
buffer大小一旦确定,则不能修改,buffer实际上就是对底层内存的直接操作
var buf=Buffer.alloc(5);//创建一个大小为5字节的buffer
buf[0]=0xaa;//类似于给数组赋值
buf[1]=88;
//注意:索引大于buffer.length-1时,创建的数据将会消失;
console.log(buf);
var buf1=Buffer.from("hello nodejs");//根据内容创建buffer,根据内容创建大小后,不可以修改,将一个字符串转换为buffer
console.log(buf1.length);//返回buf1所占内存的字节数
var buf3=Buffer.allocUnsafe(5);
//创建一个指定大小的buffer,但是可能会有敏感数据,
// 也就是如果别的程序使用过这一块内存,在他创建的时候
// 不会清空,有可能包含数据,而alloc在创建的时候就会先清空;
//性能比alloc好,因为他不清空,而alloc是清空后再创建;
console.log(buf3);
//Buffer.from(str)将一个字符串转换为buffer对象
//Buffer.allocUnsafe(size)创建一个指定大小的buffer 可能会造成数据泄露
//Buffer.alloc(size)创建一个指定大小的buffer,相对安全;
3文件系统
• 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
• Node通过fs模块来和文件系统进行交互
• 该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。
• 要使用fs模块,首先需要对其进行加载
• fs模块中所有的操作都有两种形式可供选择同步和异步。
• 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
• 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。
打开状态
r 读取文件 , 文件不存在则出现异常
r+ 读写文件 , 文件不存在则出现异常
rs 在同步模式下打开文件用于读取
rs+ 在同步模式下打开文件用于读写
w 打开文件用于写操作 , 如果不存在则创建,如果存在则截断
wx 打开文件用于写操作, 如果存在则打开失败
w+ 打开文件用于读写, 如果不存在则创建, 如果存在则截断
wx+ 打开文件用于读写, 如果存在则打开失败
a 打开文件用于追加, 如果不存在则创建
ax 打开文件用于追加, 如果路径存在则失败
a+ 打开文件进行读取和追加, 如果不存在则创建该文件
ax+ 打开文件进行读取和追加,如果路径存在则失败
4同步写入实例
/*使用同步方法创建文件
第一步打开文件
fs.openSync(路径,打开文件要操作的类型("w"可写/"r"只读),文件操作权限一般不传)
返回值:返回一个文件的描述符作为结果,我们通过描述符对文件进行操作;
第二部写入并保存文件
fs.writeSync(要写入的文件标识符,要写入的字符串内容,[要写入的起始位置,编码格式默认utf-8(这两个参数一般不写)]);
第三部关闭文件*/
fs.closeSync(要关闭文件的标识符);
const fs = require("fs");//引入模块
//打开文件
let fd=fs.openSync("hello.txt","w");
//写入内容
fs.writeSync(fd,"你好世界");
//关闭文件(节约内存)
fs.closeSync(fd);
5异步文件写入
// 使用异步方法创建文件
var fs=require("fs");
fs.open("hello2.txt","w",function (error,fd) {
console.log(arguments);
//[Arguments] { '0': null, '1': 3 }第一个表示是否成功,如果成功返回null
// 如果出错,抛出异常
if(error==null){//表示成功
console.log("读取成功");
fs.write(fd,"你好,nodejs",function (err) {
if(err==null){
console.log("写入成功");
fs.close(fd,function (erro) {
if(erro==null){
console.log("文件已关闭");
}else{
console.log("文件关闭失败");
}
});
}else {
console.log("写入失败");
}
})
}else{
console.log("读取失败");
}
})
6简单文件写入
//简单文件写入
fs.writeFile(文件路径及文件名(使用双斜杠或一个反斜杠),写入的内容,{改变操作状态可有可无},回调函数);
//引入模块
const fs =require("fs");
fs.writeFile("hello4.txt",'这是一个简单的文件创建',{flag:"w"},function(err){
console.log(arguments);
if(err==null){
console.log("写入成功");
}else{
console.log('写入失败');
}
})
7流式文件
同步,异步,简单文件写入都不适合大文件写入,性能比较差,容易导致内存溢出;
//流式文件
const fs=require("fs");
var wb=fs.createWriteStream("text.txt");//创建流
wb.once("open",function () {
//因为开启流只执行一次,所以使用on绑定事件会造成资源浪费
//所以使用once来绑定一个一次性事件,从而提高性能
console.log("流打开了");
})
wb.write("这是通过流式操作写入的文件");//将内容写入文件
wb.write("这是通过流式操作写入的文件");//将内容写入文件
wb.write("这是通过流式操作写入的文件");//将内容写入文件
wb.end();//关闭流
wb.once("close",function () {
console.log("流关闭了");
})
8同步文件读取(类似于同步文件写入)
9异步文件读取(类似于异步文件写入)
10简单文件读取
//简单文件读取
const fs=require("fs");
fs.readFile("text.txt",function (error,data) {
//第一个参数是要去读取的文件,第二个参数是回调函数
//error是返回的状态,null为成功,否则抛出异常
//data是如果成功返回的数据
console.log(arguments);
if(error==null){
console.log(data.toString());
}
})
11流式文件读取
//流式文件读取
const fs=require("fs");
var rd=fs.createReadStream("text.txt");//可读流
var wd=fs.createWriteStream("text1.txt");
rd.once("open",function (err) {
console.log("可读流打开了");
})
rd.once("close",function (err) {
console.log("可读流关闭了");
})
// rd.on("data",function (data) {
// console.log(data);
// });
//////////////////////////////////////////////////////////////////
//将读取到的数据给另一个文件
//调用一个方法 pipe 使用可读流读到的数据写入可写流
rd.pipe(wd);
12其他模块
fs.existssync()检查 路径文件是否存在
fs.stat()是否是一个文件,返回了一个对象,包含所有信息
fs.statsync()
fs.unlink()删除文件
fs.unlinksync()删除文件
13简单的http服务
//使用node可以轻松创建一个web服务器
//在node中提供了一个核心模块:http
//http就是创建编写服务器的
//1,加载http核心模块
var http=require("http");
//2,创建一个web服务器,使用http.createServer();返回一个server实例
var server=http.createServer();
//3,服务器要干嘛?
/*对数据提供服务
发请求
接收请求
处理请求
发送响应
注册request请求事件
当客户端发送过来请求request请求事件,然后
执行第二个参数:回调处理函数
回调函数(request)有两个形参,
request请求对象
请求时,获取客户端的一些数据,如请求路径
response响应对象
响应对象可以给客户端发送响应信息
注意:响应的数据要么是字符串,要么是buffer
*/
server.on("request",function(request,response){
console.log("收到请求了,请求地址"+request.url);
//response有一个方法write可以给客户端发送响应数据
//write可以使用多次,但是最后一定要用response.end()来结束响应
//否则客户端会一直等待
response.write("hello node");
response.write("hello javascript");
// response.write("hello 小天才");write只能写字符串和buffer
response.end("hello");//上面写入方法基本不用
response.end();
});
//4,绑定端口号启动服务器
server.listen(3000,function(){
//打印日志,确认服务器已启动
console.log("服务器启动了");
});
14端口号
获取客户端端口号request.socket.remotePort;
获取客户端的IP地址
request.socket.remoteAddress;
例:客户端的300端口和服务器的300端口不是一个
注意:端口号的范围是(0-65536),但是不要占用一些默认端口号比如http服务的80端口;
可以同时开启多个服务,但是端口号不能一样;
15响应中文数据乱码
其实在服务器默认发送的数据内容是utf-8,
但是浏览器不知道我是utf-8编码的内容
浏览器在不知道服务器响应的内容的编码情况下就会按照当前操作系统的编码去解析,
中文操作系统默认编码方式为gbk
解决方法:
告诉浏览器要执行的编码格式
response.setHeader("Content-Type","text/plain;charset=utf-8");
在http协议中,Content-Type就是告知对方我发的数据是什么编码方式,以及响应内容格式;
text/plain 普通文本
text/html 会解析html标签
content-type对照表http://tool.oschina.net/
图片就不用设置编码格式了,但是文件格式要写;
jQuery小知识
使用jquery获取的集合如果要使用jquery遍历,在高版本中使用foreach
在低版本中使用each;获取到的集合是一个伪数组,但是可以通过方法转换为数组;[].slice.call($(“div”));
express基本用法/基本方法
app.use(express.static('public')) //公开静态目录
//公开后就可以访问静态目录中的文件,如下例
//http://localhost:3000/css/style.css
如果要使用多个静态资源目录,请多次调用 express.static
中间件函数:
然而,您提供给express.static
函数的路径是相对于启动node
进程的目录。如果您从另一个目录运行快速应用程序,则使用您要提供的目录的绝对路径更安全:
app.use('/static', express.static(path.join(__dirname, 'public')))