Nodejs

本文介绍了Node.js的基础知识,包括Node.js的环境管理工具nvm和nrm,以及npm和npx的使用。文章详细讲解了Node.js的核心模块如fs、http、querystring和path,展示了如何处理URL和参数,以及如何进行模块化编程。此外,还涉及到了文件系统的操作,如文件读写、目录管理,以及events模块的事件监听功能。
摘要由CSDN通过智能技术生成

概述

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值