Nodejs几个常用的模块
1.nodejs模块化介绍
-
1.nodejs是一个渐进式框架, 我们后面要学习的vue框架也是渐进式框架
-
2.什么是渐进式框架呢 : 一个功能对应一个模块(js文件), 需要用的时候导入即可
-
简单来说:
- 非渐进式框架 : 套餐, 一次性导入所有的功能。 无论是的项目用还是不用(浪费资源)
- 渐进式框架 : 自助餐。 吃什么用什么,不浪费。(节省资源)
-
2.fs模块
2.1-fs文件模块(读写文件)
2.1.1-readFile读取文
//1.导入文件模块
const fs = require('fs')
//2.读取文件
/**
* 第一个参数:文件路径
* 第二个参数:编码格式 (可选参数,默认为buffer二进制)
* 第三个参数:读取回调操作(异步操作)
* err:如果读取成功,err为null, 否则读取失败(一般文件路径错误或者找不到文件)
* data:读取到的数据
*/
fs.readFile('./data/aaa.txt','utf-8',(err,data)=>{
if(err){
console.log(err)
//抛出异常,throw的作用就是让node程序终止运行,方便调试
throw err
}else{
console.log(data)
}
})
console.log('11111')
//3.同步读取文件(了解即可,几乎不用,一般在异步的api后面加上Sync就是同步)
let data = fs.readFileSync('./data/aaa.txt','utf-8')
console.log(data)
console.log('2222')
2.1.2-writeFile写入文件
//1.导入文件模块
const fs = require('fs')
//2.写文件
/**
* 第一个参数:文件路径
* 第二个参数:要写入的数据
* 第三个参数:文件编码 默认utf-8
* 第四个参数: 异步回调函数
* err: 如果成功,err为null.否则读取失败
*/
fs.writeFile('./data/bbb.txt','黑马程序员','utf-8',(err)=>{
if(err){
throw err
}else{
console.log('写入成功')
}
})
2.2 -同步与异步区别
- 1.同步会阻塞线程,异步不会
- 2.同步有序执行,异步无序执行
- 3.同步没有回调函数,异步有回调函数
//1.导入模块
const fs = require('fs')
/*js从上往下解析代码流程
1.判断是同步还是异步
2.如果是同步,则立即执行
3.如果是异步,则不执行,而是放入事件循环中(Event Loop)
4.所有代码解析完毕之后,开始执行事件循环中的异步代码
*/
/*异步操作
1.不会阻塞线程(性能高)
2.无序执行
3.有回调函数
*/
//异步操作
// console.log('55555555');
// fs.readFile('./data/aaa.txt','utf8',(err,data)=>{
// console.log('1111111')
// if(err){
// throw err
// }else{
// // console.log(data)
// }
// })
// console.log('666666');
// fs.readFile('./data/aaa.txt','utf8',(err,data)=>{
// console.log('222222')
// if(err){
// throw err
// }else{
// // console.log(data)
// }
// })
// console.log('777777');
// fs.readFile('./data/aaa.txt','utf8',(err,data)=>{
// console.log('333333')
// if(err){
// throw err
// }else{
// // console.log(data)
// }
// })
// console.log('8888888')
// fs.readFile('./data/aaa.txt','utf8',(err,data)=>{
// console.log('4444444')
// if(err){
// throw err;
// }else{
// // console.log(data)
// }
// })
//同步操作
/* 1.会阻塞线程(性能低)
2.有序执行
3.没有回调函数
*/
let data1 = fs.readFileSync('./data/aaa.txt','utf8');
console.log(data1)
console.log('11111')
let data2 = fs.readFileSync('./data/aaa.txt','utf8');
console.log('22222')
console.log(data2)
let data3 = fs.readFileSync('./data/aaa.txt','utf8');
console.log('33333')
console.log(data3)
let data4 = fs.readFileSync('./data/aaa.txt','utf8');
console.log('44444')
console.log(data4)
2.3-try-catch捕捉异常
//1.导入模块
const fs = require('fs')
/* try-catch作用:捕捉代码异常,且不影响后面代码执行
try{
需要执行的代码
}catch(err){
如果try中的代码执行错误了,就会执行catch代码
})
*/
try {
let data1 = fs.readFileSync('./data/aaa.txt', 'utf8')
console.log(data1)
} catch (err) {
console.log(err)
}
console.log('11111')
fa模块的一些方法
API | 作用 |
---|---|
fs.access(path, callback) | 判断路径是否存在 |
fs.appendFile(file, data, callback) | 向文件中追加内容 |
fs.copyFile(src, callback) | 复制文件 |
fs.mkdir(path, callback) | 创建目录 |
fs.readDir(path, callback) | 读取目录列表 |
fs.rename(oldPath, newPath, callback) | 重命名文件/目录 |
fs.rmdir(path, callback) | 删除目录 |
fs.stat(path, callback) | 获取文件/目录信息 |
fs.unlink(path, callback) | 删除文件 |
fs.watch(filename, options) | 监视文件/目录 |
fs.watchFile(filename[, options], listener) | 监视文件 |
fs.existsSync(absolutePath) | 判断路径是否存在 |
3.path路径模块
3.1-nodejs中的相对路径
-
node中的相对路径: ./ 不是相对于当前文件所在路径,而是相对于执行node命名的文件夹路径
在服务端开发中,一般不要使用相对路径,而使用绝对路径
-
解决方案:在nodejs中,每一个js文件都有两个全局属性,它可以帮助我们获取到文件的绝对路径
- __filename:当前js文件所在目录的绝对路径
- __dirmame:当前js文件的绝对路径
//1.导入文件模块
const fs = require('fs')
//2.读取文件
/*a.注意点: node中的相对路径: ./ 不是相对于当前文件所在路径,而是相对于执行node命名的文件夹路径
在服务端开发中,一般不要使用相对路径,而使用绝对路径
b.解决方案:在nodejs中,每一个js文件都有两个全局属性,它可以帮助我们获取到文件的绝对路径
__filename:当前js文件所在目录的绝对路径
__filema,e:当前js文件的绝对路径
*/
console.log(__dirname)
console.log(__filename)
/*2.如果想要获取当前文件夹下其他文件绝对路径,可以使用 __dirname属性来拼接
*/
const path = __dirname + '/aaa.txt'
console.log(path)
fs.readFile(path,'utf-8',(err,data)=>{
if(err){
console.log(err);
//抛出异常,throw的作用就是让node程序终止运行,方便调试
throw err
}else{
console.log(data)
}
})
3.2-path路径模块拼接路径
//1.导入路径模块
const path = require('path')
//2.合并路径
/*使用path模块拼接文件路径与 使用 '+'连接符拼接的好处
1.会自动帮我们正确添加路径分隔符 '/',我们无需手动添加
2.当我们路径格式拼接错误的时候,能自动帮我们转换正确的格式
*/
// path.join(路径1,路径2,路径3,……………………)
let filePath = path.join(__dirname,'aaa.txt')
console.log(filePath)
console.log(__dirname + '/aaa.txt')
let path1 = path.join(__dirname,'bbb','ccc.txt')
console.log(path1);
//获取上级目录 path.dirname(文件路径)
let path2 = path.dirname(path1)
console.log(path2)
let path3 = path.dirname(path2)
console.log(path3)
let path4 = path.dirname(path3)
console.log(path4)
path模块一些方法
方法 | 作用 |
---|---|
path.basename(path[, ext]) | 获取返回 path 的最后一部分(文件名) |
path.dirname(path) | 返回目录名 |
path.extname(path) | 返回路径中文件的扩展名(包含.) |
path.format(pathObject) | 将一个对象格式化为一个路径字符串 |
path.join([...paths]) | 拼接路径 |
path.parse(path) | 把路径字符串解析成对象的格式 |
path.resolve([...paths]) | 基于当前工作目录拼接路径 |
04-http模块(搭建服务器)
4.1-http模块搭建服务器
//1.导入模块(安装软件)
const http = require('http')
//2.创建服务器(运行软件)
/* 参数:回调函数
req: request 客户端请求对象
res:response 服务端响应对象
*/
let server = http.createServer((req,res)=>{
//获取客户端请求路径
console.log(req.url)
})
//3.启动服务器(开启软件的服务器功能)
/*第一个参数:端口号 一般1000-60000之间
第二个参数:ip地址 默认不写 就是本地ip
第三个参数:成功回调
*/
server.listen(3000,()=>{
console.log('服务器开启成功')
})
4.2-响应客户端请求
/* WEB开发本质
请求
处理
响应
*/
//1.导入模块
const http = require('http')
//2.创建服务器
/*
req:请求对象 负责处理客户端请求
res:响应对象 负责响应客户端请求
*/
let server = http.createServer((req,res)=>{
//客户端每发送一个请求,这个函数都会执行一次(执行多次)
console.log(req.url)
//响应客户端数据
res.end('hello world')
})
//3.启动服务器
server.listen(3000,()=>{
console.log('服务器开启成功')
})
4.3-根据不同请求响应不同数据
//1.导入模块
const http = require('http');
//2.创建服务器
let server = http.createServer((req,res)=>{
console.log(req.url)
//需求: 如果请求路径是/ ,响应 index 如果请求路径是/login,响应 登录页
if(req.url == '/'){
res.end('index.html')
}else if(req.url == '/login'){
//设置响应头解决中文乱码问题: 响应头作用:告诉浏览器我返回给你的数据是什么类型
/*第一个参数:状态码
第二个:响应头
*/
res.writeHead(200,{
'Content-Type': 'text/plain;charset=utf-8'// text/plain 普通文本
})
res.end('登录页')
}else{
res.end('404 not found')
}
})
//3.开启服务器
server.listen(3000,()=>{
console.log('服务器开启成功')
})
4.4-http响应客户端HTML文件
//1.导入模块
const http = require('http')
//文件模块
const fs = require('fs')
//路径模块
const path = require('path')
//2.创建服务器
let server = http.createServer((req,res)=>{
//需求: 如果请求路径是 / 返回首页html 如果是login返回登录html
//1.获取客户端请求路径
let url = req.url
//2.处理请求
//一般如果响应的是文件,不需要设置响应头,直接返回二进制数据。浏览器会自动识别数据类型并且加载
if(url == '/'){
//响应首页
fs.readFile(path.join(__dirname,'index.html'),(err,data)=>{
if(err){
throw err
}else{
console.log(data)
//3,将读取好的文件数据响应给客户端
res.end(data)
}
})
}else if(url == '/login'){
//响应登录页
fs.readFile(path.join(__dirname,'login.html'),(err,data)=>{
if(err){
throw err
}else{
//3,将读取好的文件数据响应给客户端
res.end(data)
}
})
}else{
res.end('404 not found')
}
})
//3.开启服务器
server.listen(3000,()=>{
console.log('服务器开启成功')
})
转载自:https://juejin.cn/post/7099240786885083150