node.js开发网站
node.js本身就是一个http服务器,不需要web容器。
node.js需要我们自己写代码处理请求。
Node的文件系统
fs模块:提供了文件操作的API。
fs模块共有5个类:
- fs.Dirent类:指示文件的类型
- fs.FSWatcher类:监视文件的状态
- fs.ReadStream类:读取流(文件输入流)
- fs.WriteStream类:写入流(文件输出流)
- fs.Stats类:文件的信息(文件的状态)
fs模块中方法的分类:
- 同步方法:方法名带有Sync后缀
- 异步方法:方法名不带Sync后缀,最后一个参数都是回调函数
Node中文件路径的表示方式:
字符串方式:
- windows系统下路径分割符为:\
- 在linux系统下路径分割符为:/
Buffer:Buffer.from(字符串) – 主要用于linux系统
URL方式:在Node7.6.0以上的版本使用,支持file协议。
在不同的操作系统下解析出来的路径会有区别。
const fileurl = new URL('file:///temp/hello.txt')
文件模式(文件的访问权限):
- a:以追加的方式打开文件,若文件不存在则创建
- a+:以读取追加的方式打开文件,若文件不存在则创建
- r:以只读的方式打开文件,若文件不存在则抛出异常
- r+:以读写的方式打开文件,若文件不存在则抛出异常
- w:以写入的方式打开文件,若文件不存在则创建
- w+:以读写的方式打开文件,若文件不存在则创建
文件与目录的基本操作
文件的打开
- 同步打开
fs.openSync('文件名',文件标记符)
- 异步打开
fs.open('文件名','打开方式',callback);
获取文件信息:fs.Stats
stats.isDirectory([path]):判断参数path是否是目录,若是返回true,若不是返回false
stats.isFile([path]):判断参数path是否是文件,若是返回true,若不是返回false
const fs = require('fs');
fs.stat('E:\\德云社\\代码\\7.30\\02.txt',(err, stats) => {
if(err) {
throw err;
}
console.log(stats);
console.log('是否是文件:',stats.isFile());
console.log('是否是目录:',stats.isDirectory());
})
异步读取文件:
fs.readFile('E:\\代码\\7.30\\02.txt',(err,data) => {
if(err) {
console.log(err);
}
console.log(`文件内容是:` + data.toString());
})
console.log('主程序结束');
同步读取文件:
var data = fs.readFileSync('E:\\代码\\7.30\\02.txt');
console.log(data.toString());
console.log('主程序结束');
创建目录:fs.mkdir(path,callback)
删除目录:fs.rmdir(path,callback)
删除文件:fs.unlink(path,callback)
写入文件操作
fs模块:在使用的时候,必须通过require( )函数来加载该模块才能使用。
//fs模块不是全局模块 全局模块可以直接使用 非全局模块需要先进行加载
var fs = require('fs')
调用fs.writeFile(file, data[, options], callback)
实现文件写入。
// 加载文件操作模块
var fs = require('fs');
//实现文件写入操作
var msg = 'Hello';
// 调用writeFile()实现文件写入
// fs.writeFile(file, data[, options], callback)
fs.writeFile('./hello.txt',msg,'utf8',function (err) {
// 如果err === null 表示文件写入成功
if(err) {
console.log(err);
}else {
console.log('ok');
}
})
读文件操作
调用fs.readFile(path[, options], callback)
实现文件读取。
var fs = require('fs');
// 调用readFile()方法来读取文件
// 在读取文件的时候,如果传递了编码,那么回调函数中会自动转化
// callback两个参数 err data
fs.readFile('./hello.txt',function (err,data) {
if(err) {
throw err;
}
// data参数的数据类型是Buffer对象 里面保存的是一个个的字节
// 转化为字符串
console.log(data.toString('utf8'));
})
path模块拼接路径
var fs = require('fs');
var path = require('path')
var filename = path.join(__dirname,'hello.txt')
console.log(__dirname)
console.log(__filename)
// 调用readFile()方法来读取文件
// 在读取文件的时候,如果传递了编码,那么回调函数中会自动转化
fs.readFile(filename,function (err,data) {
if(err) {
throw err;
}
// data参数的数据类型是Buffer对象 里面保存的是一个个的字节
// 转化为字符串
console.log(data.toString('utf8'));
})
Node事件处理机制
事件队列:将事件放入事件队列。
事件循环机制:对事件队列中的事件进行轮询、检查,依次处理每个事件。
事件监听:
- 引入事件模块:events
- 创建事件监听对象:EventEmitter
- 注册监听:监听不同类型的事件(使用
on
函数)
触发事件:使用emit
函数
//引入事件处理模块
const EventEmitter = require('events');
//创建事件监听对象:对事件进行监听
const myEimtter = new EventEmitter.EventEmitter();
//注册监听:使用on函数 seen表示事件类型 若该事件被触发则执行后面的处理程序
myEimtter.on('see',(who) => {
console.log(`${who},你回来了`);
})
myEimtter.on('seen',function () {
console.log('欢迎回家');
})
//触发事件
myEimtter.emit('see','邓瑛');
myEimtter.emit('seen');
Node的全局对象
全局属性:
__filename:指的是当前正在执行的脚本文件的完善路径
__dirname:指的是当前正在执行的脚本文件的目录(路径)
全局对象:
- console实例对象
console.log("字符串"):输出到标准终端
console.error():输出错误信息
- process:进程对象
process.stdout:输出对象,该对象下的write方法的作用与console.log()相同
proce.stdin:输入对象,利用该对象可以从标准输入终端向node程序输入数据
全局函数:
setTimeout(cb,ms):cb表示一个回调函数,ms表示时间(单位是毫秒);表示至少多少毫秒以后调用函数返回一个可以清除的计时器对象。
clearTimeout(计时器对象):清除由setTimeout创建的计时器
setInterval(cb, ms):至少多少毫秒以后重复运行回调函数cb
clearInterval(计时器对象):清除由setInterval创建的计时器
setImmediate(cb):即时计时器,该计时器的运行没有时间间隔,创建即运行;返回计时器对象
clearImmediate(计时器对象):清除由setImmediate创建的计时器
Buffer
JavaScript语言没有读取或操作二进制数据流的机制。
Node.js中引入了Buffer类型使我们可以操作TCP流或文件流。
专门用于处理二进制数据的对象(接口),Node原生创建,可以直接使用不需要导入。
Buffer对象又称为缓冲区对象,它有一个构造函数,由构造函数创建的对象,v8引擎会为其分配一块内存。
Buffer中存放的数据是0~255之间的整数值(即一个字节的数据)。
Buffer类型的对象类似于整数数组,但Buffer的大小是固定的,它的大小在创建时确定,且无法调整。
Buffer用来临时存储一些二进制数据,可以传输数据,每次传输小部分数据,直到所有数据都传输完毕。
创建Buffer实例:
- 使用new运算符(过时)
var 变量 = new Buffer([参数])
- 使用from函数
var 变量 = Buffer.from([参数])
- 使用alloc函数
var 变量 = Buffer.alloc(size,fill)
将Buffer中的数据转换为字符串:
使用toString
函数,需要指定字符集(编码格式),默认utf8。
console.log(buf6.toString('utf8',0,4));
拼接多个Buffer:
var buf = [buf1,buf2,buf3];
var buffer = Buffer.concat(buf)
获取字符串对应的字节个数:
var len = Buffer.byteLength('你好世界hello','utf8')
console.log(len)
//17 汉字一个占三个字节 英文字母一个占一个字节
将Buffer转换为JSON对象:
JSON(JavaScript Object Notation)对象:是前后端数据交换的常用格式,是以key-value的方式保存数据,由于体积小、创建方便、解析简单,所以被广泛使用。
只要应用程序需要将结构化信息作为文本进行交换或存储,即可使用它。
使用Node的JSON对象进行转换:
var json = JSON.stringify(buf);