前言
Node.js是javaScript的运行时,是运行在Chorme V8引擎上的,运行速度是极快的
非阻塞IO模型
非阻塞IO就是在程序执行时,如果碰到了IO指令,就开始调用底层的IO操作,但是主程序不用等待底
层IO返回结果,直接执行下一步指令,等IO操作完成之后,再通知主进程就可以了。
事件驱动
这两个特性,让node.js在 io 密集的高并发场景下,具有相当明显的优势
高并发
官方API文档
全局模块
随时随地都可以范文,不需要引用
核心模块
不需要单独下载。可以直接使用 require() 引入的模块
path模块
路径相关
normalize // 用于规范化给定的path
join // 将所有给定的path片段连接在一起
reslove // 解析为绝对路径
isAbsolute // 检查当前path是否为绝对路径
文件相关
basename //返回路径中最后一部分的文件名
extname // 返回路径最后文件名的拓展名
dirname // 返回path路径中的目录名
路径解析
文件操作模块(fs)
Node中JavaScript具有文件操作的能力
fs是file-system的简写,就是文件系统的意思
异步和同步
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
同步文件系统会阻塞程序的进行,也就是除非操作完毕,否则不会向下执行代码
异步文件系统不会阻塞程序的进行,而是在操作完成时,通过回调函数返回
实例:
创建 input.txt 文件,内容如下:
菜鸟教程官网地址:www.runoob.com
文件读取实例
创建 file.js 文件, 代码如下:
var fs = require("fs");
//参数,第一个是路径
// 第二个是回调函数
//成功:error为null,data为数据
//失败:error为错误对象,data为null
// 异步读取
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
//输出(16进制
//需要进行toString操作
console.log("异步读取: " + data.toString());
});
// 同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString());
console.log("程序执行完毕。");
以上代码执行结果如下:
>node file.js
同步读取:
菜鸟教程官网地址:www.runoob.com
异步读取:
菜鸟教程官网地址:www.runoob.com
写入文件
会覆盖原有的文本内容,没有则创建
/**
* 异步写入
* @param {string} 文件路径,输入文件内容,回调函数
*/
fs.writeFile('./a.txt', '异步写入', function (error) {
if(error){
return console.log("异步写入失败");
}
console.log('异步写入');
})
/**
* 同步写入
* @param {string} 文件路径,输入文件内容
*/
fs.writeFileSync('./a.txt','同步写入')
读取文件
语法
以下为异步模式下读取文件的语法格式:
fs.read(fd, buffer, offset, length, position, callback)
该方法使用了文件描述符来读取文件。
参数
参数使用说明如下:
fd - 通过 fs.open() 方法返回的文件描述符。
buffer - 数据写入的缓冲区。
offset - 缓冲区写入的写入偏移量。
length - 要从文件中读取的字节数。
position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
关闭文件
语法
以下为异步模式下关闭文件的语法格式:
fs.close(fd, callback)
该方法使用了文件描述符来读取文件。
参数
参数使用说明如下:
fd - 通过 fs.open() 方法返回的文件描述符。
callback - 回调函数,没有参数。
实例
input.txt 文件内容为:
菜鸟教程官网地址:www.runoob.com
接下来我们创建 file.js 文件,代码如下所示:
var fs = require("fs");
var buf = new Buffer.alloc(1024);
console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("文件打开成功!");
console.log("准备读取文件!");
fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
if (err){
console.log(err);
}
// 仅输出读取的字节
if(bytes > 0){
console.log(buf.slice(0, bytes).toString());
}
// 关闭文件
fs.close(fd, function(err){
if (err){
console.log(err);
}
console.log("文件关闭成功");
});
});
});
以上代码执行结果如下:
$ node file.js
准备打开文件!
文件打开成功!
准备读取文件!
菜鸟教程官网地址:www.runoob.com
文件关闭成功
同步文件,异步文件,简单文件写入都不适合大文件的写入,性能较差,容易内存溢出
获取文件目录
fs.readdir('D:',function(err,files){
if(err){
}else{
console.log(files)
}
})
Http模块
//加载http核心模块
var http=require('http')
// 使用http.createServer方法创建一个web服务器
var server=http.createServer()
//服务器:对数据进行服务
//发送请求
//接受请求
//处理请求
//注册request事件
server.on('request',function (){
console.log('收到客户的请求了')
})
//绑定端口号
server.listen(3000,function (){
console.log('服务器启动成功了')
})
request事件函数
//request请求事件处理函数,需要接收两个参数
//request请求对象
//请求对象可以用来获取客户端的一些请求信息,例如请求路径
//reponse响应对象
//响应对象可以用用来给客户发送响应消息
server.on('request',function (request,reponse){
console.log('收到客户的请求了'+request.url)
//reponse对象的write方法可以给用户发送响应数据
//write可以使用多次,但最后一定要使用end来结束响应,否则客户端会一直等待
reponse.write('hello')
reponse.write('hello world')
reponse.end() //终止该响应
})
Url模块
Node.js实现301、302重定向服务
Node.js重定向详解链接
301 永久重定向 ,浏览器会记住,再次访问会直接跳转
302 临时重定向,会去服务端请求,再跳转
自定义模块
自己封装的模块,可以直接使用 require() 引入