概述
Nodejs是一个用于服务端的js库,支持很多的包(第三方库导入)。
Nodejs 是一个免费的、开源的、跨平台的 JavaScript 运行时环境。
允许开发人员在浏览器之外编写命令行工具和服务器端脚本。
node环境安装关键词
- nvm (node version Management)用于node的版本管理
- nrm (node remote Management)用于node的镜像管理 (npm的镜像)
- npm :用于执行对于的 node 脚本 、缓存、包管理工具
- npx :用于快速执行 node 的脚本 、执行后删除
- node :用于运行对应的 js 文件
模块包
内置模块包 (内置到node环境中)(node官网)*
- fs模块 :fileSystem 、文件系统
- http :http模块、 处理http请求的模块
- querystring :参数处理
- path :路径处理
- url :url处理
- ...
第三方模块包 (需要下载安装)(npm官网)
- express
- jsonwebtoken
- md5
- uuid
- mysql
- body-parse
- mongodb
- ...
入门模块
模块化原则
- AMD
- CMD
- comment.js
- require.js
//导入 ,关于模块路径如果是node-modules中导入的模块,那么不需要对应的 ./ 开头(模块名) 否则需要(路径)
- const http = require( ' 模块路径 ' )
//导出 相当于export default
- module.exports = 导出的内容
监听的对应服务帮助重启
下载:npm i nodemon -g
nodemon 文件名
下载:npm i supervisor -g
supervisor 文件名
总结
- url:模块用于读取对应的url的内容
- querystring:可以将对应的参数字符串变成一个对象
- http:模块中获取 get 请求传递的参数通过 query 来获取。模块中获取 post 请求传递的参数通过监听 data 事件,因为 post 的内容是在 body 中分段传递的,需要进行拼接
【示例】
let data = " "
req.on("data",(chunk)=>{
data+=chunk
})
let parame = decode(data) // { username:'tom' ,password:'123456' }
【示例】
const path = require("path")
const { parse } = require("url")
const { decode } = require("querystring")
let url = "http://localhost:8888/login?username=tom&password=123456"
// console.log(parse(url));
//Url {
// protocol: null,
// slashes: null,
// auth: null,
// host: null,
// port: null,
// hostname: null,
// hash: null,
// search: '?username=tom&password=123456',
// query: '?username=tom&password=123456',
// pathname: 'http://localhost:8888/login?',
// path:'http://localhost:8888/login?username=tom&password=123456',
// href:'http://localhost:8888/login?username=tom&password=123456'
// }
console.log(parse(url).pathname);
// localhost:8888/login
console.log(parse(url).query);
//?username=tom&password=123456
console.log(decode(parse(url).query));
//{ 'username':'tom','password':'123456' }
path模块
用于操作对应的文件路径相关内容(获取路径相关信息,拼接路径)
方法
- dirname :获取文件名
- basename :获取最后的路径名
- extname :获取扩展名 *
- isAbsolute :判断是否为绝对路径
- relative :返回一个路径基于另一个的相对路径
- join :连接多个路径返回一个新的路径 *
- format :将对应的路径字符串转为对象
- parse :将对应的路径对象转为字符串
- resolve :返回对应的绝对路径拼接的字符串
- normalize :返回一个路径
//导入模块
const path = require('path')
//__dirname 全局变量表示当前的文件夹路径(绝对路径)
//__filename 全局变量表示当前的文件路径(绝对路径)
console.log(__dirname)
//G:\CS-H52210\practice\TwoStep\cases\classKnowledge\day32-node
console.log(__filename)
//G:\CS-H52210\practice\TwoStep\cases\classKnowledge\day32-node\path模块讲解.js
//相关方法
//join方法是将多个相关的地址连接成一个地址 路径拼接
let pathStr = path.join('c://', 'list', '/txt.txt')
console.log(pathStr); // c:\list\txt.txt
console.log(path.join(__dirname, 'hello.jpg'))
//G:\CS-H52210\practice\TwoStep\cases\classKnowledge\day32-node\hello.jpg
//normalize 默认返回对应的路径
console.log(path.normalize(__filename));
//G:\CS-H52210\practice\TwoStep\cases\classKnowledge\day32-node\path模块讲解.js
//resolve 返回一个路径地址 返回对应的一个路径 如果没有找到返回没有找到的路径
//将一个相对路径的地址返回一个绝对路径
console.log(path.resolve('./txt.txt'));
//G:\CS-H52210\practice\TwoStep\cases\classKnowledge\day32-node\txt.txt
//isAbsolute 判断是否是一个绝对路径
console.log(path.isAbsolute(__dirname)); //true
//relative 返回一个路径相对一个的路径 第一个相对的路径 第二个是对应的路径
console.log(path.relative(__dirname, __filename)); //path模块讲解.js
//获取当前的文件夹名字
console.log(path.dirname(__filename));
//G:\CS-H52210\practice\TwoStep\cases\classKnowledge\day32-node
console.log(path.dirname('c:/hello/html.html')); //c:/hello
//获取当前的文件名
console.log(path.basename('c:/hello/html.html')); //html.htm
//获取对应的扩展名
console.log(path.extname('c:/hello/html.html')); //.html
//转换位命名空间下的路径地址
console.log(path.toNamespacedPath(__filename));
fs模块
fs模块(fileSystem 文件系统模块) 主要是文件相关的操作。(io流(input output 输入输出 io是属于异步操作(buffer 缓冲区))node中提供io的模块Stream)
- mkdir :创建文件夹
- readFile :读取文件
- writeFile :写入文件
const fs = require('fs')
const path = require("path")
// @parmeter from拷贝的文件 to 拷贝到的文件地址
// @return void
function copy(from, to) {
//读取对应的文件
let data = fs.readFileSync(path.resolve(from))
//将读取的内容写入到对应的拷贝的地址
let toPath = path.join(__dirname, to, Date.now() + path.extname(from))
fs.writeFileSync(toPath, data)
}
copy('./a/Dog.jpg', './b')
stat的方法
- isFile :是否为文件
- isDirectory :是否为文件夹
- isFIFO :是否先进先出
//导入fs模块
const fs = require('fs')
//获取文件相关信息 stat
//拿到stat对象
fs.stat('./a/a.txt', (err, stats) => {
if (err) throw new Error(err)
console.log(stats)
//相关方法
// 判断是否为文件
console.log(stats.isFile()) //true
//判断是否为文件夹
console.log(stats.isDirectory()) //false
//first input first output
console.log(stats.isFIFO()) //false
})
fs的方法
- readdir 读取文件夹
- exist :判断当前文件是否存在
- existSync :同步的
- writeFile :重写文件内的内容、会覆盖
- appendFile :追加内容到文件中
- rename :更改文件名字
- rm :删除文件
- unlink :删除文件
- rmdir :删除文件夹(针对空文件夹)
- chown :异步修改,变更用户和用户组
- chownSync :同步修改
//导入fs模块
const fs = require('fs')
//获取文件相关信息 stat
//拿到stat对象,stat的相关方法
fs.stat('./a/a.txt', (err, stats) => {
if (err) throw new Error(err)
console.log(stats)
//相关方法
// 判断是否为文件
console.log(stats.isFile()) //true
//判断是否为文件夹
console.log(stats.isDirectory()) //false
//first input first output
console.log(stats.isFIFO()) //false
})
//读取文件夹 返回一个字符串数组 文件列表数组
let strArr = fs.readdirSync('./a')
console.log(strArr) //[ 'a.txt', 'Dog.jpg' ]
// existSync 同步的,判断是否存在
console.log(fs.existsSync('./a')); //true
// writeFile 重写文件内的内容 (覆盖)
//写入 会覆盖原本的内容
fs.writeFile('./a/a.txt', '你好世界', (err) => {
if (err) console.error('写入错误')
console.log('写入成功')
})
// appendFile 追加内容到文件中
//追加新的内容
fs.appendFile('./a/a.txt', 'hello world', (err) => {
if (err) console.error('写入错误')
console.log('成功')
})
//rename 更改名字
fs.rename('./a/a.txt', './a/newFile.txt', (err) => {
if (err) console.error('改名错误')
console.log('改名成功')
})
// rm 删除文件
// unlink 删除文件
// rmdir 删除文件夹(针对空文件夹)
//删除文件
fs.rm('./a/a.txt', (err) => {
if (err) console.log(err)
console.log('删除成功')
})
fs.unlink('./b/1679833707311.jpg', (err) => {
if (err) console.log(err)
console.log('删除成功')
})
//删除文件夹 (针对空文件夹才能进行删除)
fs.rmdir('./b', (err) => {
if (err) console.log(err)
console.log('删除成功')
})
// 变更用户和用户组
// chown 异步修改
// chownSync 同步修改
//更改权限
//当前的用户、当前的用户组、所有的用户
//读 写 操作 1 2 4 通过linux指令 查看对应的权限 ls -l 或者 ll
//变更用户
fs.chown('./a/newFile.txt', 0, 0, (err) => {
if (err) throw new Error(err)
console.log('成功')
})
【示例】
删除文件夹的方法 (将底下的所有文件及当前文件夹删除)
const fs = require("fs")
const { join, dirname } = require("path")
function rmAll(path) {
//判断是否存在
if (fs.existsSync(path)) {
//判断是否为文件夹
let stats = fs.statSync(path)
if (stats.isDirectory()) {
//获取所有的文件
let arr = fs.readdirSync(path)
//判断文件夹下是否有文件
if (!arr.length) {
fs.rmdirSync(path)
} else {
//遍历
arr.forEach(v => {
rmAll(join(path, v))
});
}
} else {
//文件直接删除
fs.rmSync(path)
rmAll(dirname(path))
}
} else {
return
}
}
rmAll('./a')
events模块
内部实现观察者模式 (node中用到事件的地方就会导入对应events模块)主要用到的类EventEmitter
- on :监听事件
- off :取消事件
- emit :执行事件
- once :执行一次(监听一次)
const event = require('events')
//最重要的对象,eventEmitter
let emitter = new event.EventEmitter()
function handle(...arg) {
console.log("你好" + arg); //你好tom,jack
}
//事件监听
emitter.on('hello', handle)
emitter.off('hello', handle)
//事件执行
emitter.emit('hello', 'tom', 'jack')