node.js笔记

这篇博客详细介绍了Node.js中的全局对象,包括__dirname、__filename等,并讲解了os、path、url、util模块的用法。还深入探讨了fs模块、文件流、net模块和http模块的操作,如异步读写、socket通信和HTTP请求响应。同时,提到了生命周期管理和背压问题的解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

global -全局对象

1. __dirname 返回当前运行文件的文件夹目录

2. __filename 返回当前运行文件路径

3. clearImmediate(immediateObject)

4. clearInterval(intervalObject)

5. clearTimeout(timeoutObject)

6. console

7. exports

8. global

9. module

在这里插入图片描述

10. process

 process.cwd()  返回当前nodejs进程的工作目录
 process.exit()  强制退出当前node进程
 process.argv   获取命令中的所有参数
 process.platform   获取当前的操作系统
 process.kill(pid)   根据进程ID杀死进程
 process.env   获取环境变量对象
 

11. queueMicrotask(callback)

12. require()

有一些静态方法:

  • require.cache
  • require.resolve(request[, options]) 把运行文件的相对路径解析成绝对路径

request 要解析的模块路径。

在这里插入图片描述

options <对象>
第二个参数是一个对象,对象的属性名为path
返回:

  • require.resolve.paths(request)
  • require.main 返回主模块module 对象
  • require.extensions

13. setImmediate(callback[, …args])

14. setInterval(callback, delay[, …args])

15. setTimeout(callback, delay[, …args])

16. TextDecoder

17. TextEncoder

18. URL

19. URLSearchParams

20. WebAssembly

__dirname,__filename 并非是global的属性

os 、path、url、util模块

在这里插入图片描述

require.resolve() 和 path.resolve() ,path.join([…paths])的区别

require.resolve() 返回的是当前运行文件的绝对路径,require.resolve 还会在拼接好路径之后检查该路径是否存在, 如果 resolve 的目标路径不存在, 就会抛出错误.

** path.resolve( ‘./a.js’)** 把一系列路径或路径段解析为绝对路径,是路径解析

path.resolve('/foo/bar', './baz')   // returns '/foo/bar/baz'
path.resolve('/foo/bar', 'baz')   // returns '/foo/bar/baz'
path.resolve('/foo/bar', '/baz')   // returns '/baz'
path.resolve('/foo/bar', '../baz')   // returns '/foo/baz'
path.resolve('home','/foo/bar', '../baz')   // returns '/foo/baz'
path.resolve('home','./foo/bar', '../baz')   // returns '/home/foo/baz'
path.resolve('home','foo/bar', '../baz')   // returns '/home/foo/baz'
从后向前,若字符以 / 开头,不会拼接到前面的路径(因为拼接到此已经是一个绝对路径);

     若以 ../ 开头,拼接前面的路径,且不含最后一节路径;

        若以 ./ 开头 或者没有符号 则拼接前面路径;

需要注意的是:如果在处理完所有给定的 path 片段之后还未生成绝对路径,则再加上当前工作目录。

**path.join([…paths]) **就是把各个路径拼接成绝对路径,如果任何路径段都不是字符串,则抛出错误

path.join()和path.resolve()不会检查生成的路径是否存在

注意:node环境中的相对路径,指的是相对的是使用node命令时命令行的路径(相对于process.cwd()), 只有 require('./')导入文件时才是相对当前文件(模块)

fs 模块

在这里插入图片描述
fs模块下大部分都是异步的
每个api 对应的aync,都是同步函数,会导致程序阻塞,通常会在程序启动时运行

删除文件,fs.unlink

fs.promises 返回一个promise

引入是可以使用 require('fs/promises')

文件流

在这里插入图片描述
用fs.createReadStream()创建一个可以读流, 返回一个可读流 类(class)
在这里插入图片描述
在这里插入图片描述

使用fs.createWriteStream() 时注意背压问题,由于可写流每次传输会默认为16KB,会导致背压,大量占用内存

背压

const ws = fs.createWriteStream()
ws.write(‘数据’) 会返回一个flag,flag 为true时表示,还可以继续写入,flag为false时,表示管道已满,会产生背压
在这里插入图片描述
在这里插入图片描述
drain事件 触发后管道可以继续被写入数据
使用drain事件(),可以处理背压问题在这里插入图片描述

把test文件夹下1.txt文件 复制到 src文件夹下2.txt


// 方法一 
async function method1(){
    const fromFileName = path.resolve(__dirname,'./test/1.txt')
    const content= await fs.promises.readFile(fromFileName)
    const toFileName = path.resolve(__dirname,'./src/2.txt')
    fs.promises.writeFile(toFileName,content)
}


// 方法二:
 function method2(){
    const fromFileName = path.resolve(__dirname,'./test/1.txt')
    const toFileName = path.resolve(__dirname,'./src/2.txt')
    const rs = fs.createReadStream(fromFileName)
    const ws = fs.createWriteStream(toFileName)
    rs.on('data',chunk=>{
       const  flag = ws.write(chunk)
       if(!flag){
            rs.pause()   
       }
    })
    ws.on('drain',()=>{
        rs.resume()
    })
}
function method2(){
    const fromFileName = path.resolve(__dirname,'./test/1.txt')
    const toFileName = path.resolve(__dirname,'./src/2.txt')
    const rs = fs.createReadStream(fromFileName)
    const ws = fs.createWriteStream(toFileName)
    rs.on('data',chunk=>{
       const  flag = ws.write(chunk)
       if(!flag){
            rs.pause()   
       }
    })
    ws.on('drain',()=>{
        rs.resume()
    })
   
    
}

function method3(){
    const fromFileName = path.resolve(__dirname,'./test/1.txt')
    const toFileName = path.resolve(__dirname,'./src/2.txt')
    const rs = fs.createReadStream(fromFileName)
    const ws = fs.createWriteStream(toFileName)
    rs.pipe(ws)
   
    
}
method3()

方法一:会大量占用内存,方法二和三只会一点一点读取,占用内存较少

net

在这里插入图片描述

socket

socket 是一个特殊的文件,他负责向网卡传输内容,是个双工流

http

在这里插入图片描述

http.request(url[, options][, callback]) 作为客户端,发送一个请求

类: http.ClientRequest 作为客户端,发送请求

客户端发送给服务器

http.request() 会返回一个对象request,request的方法和事件用于处理消息头、消息体的 设置、发送 等

类: http.ServerResponse

服务器响应给客户端

类: http.IncomingMessage

表示即将接收到的消息,即可以是服务端,也可以是客户端发送来的消息

是一个可读流, 由http.Server 或者 http.ClientRequest 返回 ,用于获取响应消息的状态,消息头,消息体
该对象是由HTTP服务器在内部创建的,而不是由用户创建的。它作为第二个参数传递给’request’事件。

http.createServer([options][, requestListener]) 作为服务器

客户端发送请求:
http.request(url[, options][, callback]) 返回 请求对象<http.ClientRequest>
callback的参数是服务器响应的http.IncomingMessage 对象

const  requset = http.request('http://baidu.com',{
  method:'GET'
},resp=>{
   console.log(resp.heards)
})
    request.write()  //写消息体
    request.end()  //发送请求,必须完成发送

http 总结:

作为客户端发送请求是,得到的响应就是http.IncomingMessage ;
http.request()返回的是http.ClientRequest客户端请求对象
作为服务器,接受的请求就是http.IncomingMessage;响应的结果是http.ServerResponse响应对象

生命周期

生命周期详见:

官网:https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/

网友:https://segmentfault.com/a/1190000016019979

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值