Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(下)

简介: Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)

Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(上):https://developer.aliyun.com/article/1420284


Node.js process.nextTick()



当将一个函数传给 process.nextTick(callFn) 时,则指示引擎在当前操作结束(在下一个事件循环开始之前)时调用此函数:传递给 process.nextTick(callFn) 的函数会在 当前 的这次事件循环末尾被立即执行。

const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
 console.log('foo')
 new Promise((resolve, reject) =>
 resolve('应该在 bar之后')
).then(resolve => console.log(resolve))
 process.nextTick(bar)
 baz()
}
foo()
//foo
//baz
//bar
//应该在 bar之后


Node.js 全局对象



在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global ,所有全局变量(除了 global 本身以外)都是global 对象的属性。


全局变量可以直接进行使用,不需要引入。


1、__filename:表示当前正在执行的脚本的文件名,输出文件所在位置的绝对路径

2、__dirname:表示当前执行脚本所在的目录

3、setTimeout(cb, ms)

4、clearTimeout(t)

5、setInterval(cb, ms)

6、console

7、process:用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口

       7.1、process.exit()—退出当前的node进程

       7.2、process.env—获取所有环境变量

       7.3、process.on('uncaughtException',callFn)—捕获未捕获的异常


Node.js 模块规范



Node.js模块规范遵循CommonJs模块规范。


1、require —导入要使用的模块

2、module.exports—导出要供其它模块使用的功能

3、exports—导出要供其它模块使用的功能


注意: 不可以直接对exports赋值


Node.js 事件



Node.js 所有的异步 I/O 操作在完成时都会发送一个事件。


所有这些产生事件的对象都是 events.EventEmitter 的实例,实例化生成的对象叫做事件触发器。


实例化:

// 引入 events 事件模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();


1、添加事件监听器: eventEmitter.on(event, listener)

eventEmitter.on('some_event', function(e)
{
  console.log('some_event 事件触发');
  console.log(e);
});


2、触发事件: eventEmitter.on(event,[arg1],[arg2],..)

eventEmitter.emit('some_event','params')


3、移除事件监听器: eventEmitter.removeAllListeners([event])

eventEmitter.removeAllListeners([event])


Node.js Buffer(缓冲区)



Buffer 是内存区域,一个专门存放二进制数据的缓冲区。


1、创建buffer


将数据写入缓冲区: Buffer.from(string[, encoding])

const buf = Buffer.from('tong');


2、从缓冲区读取数据: Buffer.toString([encoding[, start[, end]]])

console.log(buf.toString())
console.log(buf.toString('utf-8',0,2))


3、合并Buffer

const buf1 = Buffer.from('小童');
const buf2 = Buffer.from('程序员');
const buf3=Buffer.concat([buf1,buf2])
console.log(buf3.toString())
//console.log(buf1+buf2)


Node.js Stream(流)(一)



流是为 Node.js 应用程序提供动力的基本概念之一。


流是一种以高效的方式处理读/写文件、网络通信、或任何类型的端到端的信息交换。


stream 提供了构建所有流 API 的基础。 所有的流都是 EventEmitter 的实例。


举例:

var fs = require("fs");
fs.readFile(__dirname + '/input.txt', (err, data) => {
  console.log(data.toString())
})
//可读流可以从一文件中读取信息。
//读取的数据可以暂时存放在缓存(Buffer)里,防止应用程序无法及时处理。
//创建可读流
var readerStream = fs.createReadStream('input.txt');
// 处理流事件
readerStream.on('data', function(chunk) {
  data += chunk;
});


流基本上提供了两个主要优点:


1、内存效率: 无需加载大量的数据到内存中即可进行处理。


2、时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始。


创建可读流

const Stream = require('stream')
//首先创建流对象
const readableStream = new Stream.Readable()
//实现 readable._read() 方法
readableStream._read=()=>{}
//监听可读流里面是否有可读的数据
readableStream.on('data',(chunk)=>{
  console.log(chunk.toString())
})
//发送数据
readableStream.push('小童')
readableStream.push('程序员')


Node.js Stream(流)(二)



Stream 有四种流类型:


1、Readable - 可读操作。

2、Writable - 可写操作。

3、Duplex - 可读可写操作。

4、Transform - 操作被写入数据,然后读出结果。


流常用的事件有:


1、data - 当有数据可读时触发。

2、end - 没有更多的数据可读时触发。

3、error - 在接收和写入过程中发生错误时触发。

4、finish - 所有数据已被写入到底层系统时触发。


创建可写流:

//创建可写流对象
const Stream = require('stream')
const writableStream = new Stream.Writable()
//实现_write
writableStream._write = (chunk, encoding, next) => {
 console.log(chunk.toString())
 next()
}
//写入数据
writableStream.write('hellow')
writableStream.write('world')


写入文件:

//可写流可以将数据写入文件中。
//为了防止因为写入目标处理速度太慢导致数据丢失,写入的数据可以暂存在可写流
//内部的缓存(Buffer)中。
//创建文件可写流对象
const fs=require('fs')
const writableStream =fs.createWriteStream('output.txt');
// 使用 utf8 编码写入数据
writableStream.write('hello','UTF8');
writableStream.write('xiaotong','UTF8');
// 标记文件末尾
writableStream.end();
// 监听写入文件完成
writableStream.on('finish', function() {
  console.log("写入完成。");
})
目录
相关文章
|
3月前
|
前端开发 JavaScript
个人征信电子版无痕修改, 个人信用报告pdf修改,js+html+css即可实现【仅供学习用途】
本代码展示了一个信用知识学习系统的前端实现,包含评分计算、因素分析和建议生成功能。所有数据均为模拟生成
|
3月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
128 1
|
3月前
|
前端开发
个人征信PDF无痕修改软件,个人征信模板可编辑,个人征信报告p图神器【js+html+css仅供学习用途】
这是一款信用知识学习系统,旨在帮助用户了解征信基本概念、信用评分计算原理及信用行为影响。系统通过模拟数据生成信用报告,涵盖还款记录
|
4月前
|
JavaScript 数据可视化 前端开发
three.js简单实现一个3D三角函数学习理解
1.Three.js简介 Three.js是一个基于JavaScript编写的开源3D图形库,利用WebGL技术在网页上渲染3D图形。它提供了许多高级功能,如几何体、纹理、光照、阴影等,以便开发者能够快速地创建复杂且逼真的3D场景。同时,Three.js还具有很好的跨平台和跨浏览器兼容性,让用户无需安装任何插件就可以在现代浏览器上观看3D内容。
172 0
|
6月前
|
JSON JavaScript 前端开发
菜鸟之路Day23一一JavaScript 入门
本文介绍了 JavaScript 的基础内容,包括 JS 的引入方式、基础语法、数据类型、运算符、类型转换、函数、对象(如 Array、String、自定义对象、JSON、BOM 和 DOM)、事件监听,以及 Vue 框架的初步使用。重点讲解了内部和外部脚本的引入、变量声明(var、let、const)、常见输出语句、数组与字符串的操作方法、DOM 操作及事件绑定,并通过实例展示了 Vue 的双向数据绑定和常用指令(v-bind、v-model、v-on、v-if、v-for 等)。
162 7
|
7月前
|
JavaScript Shell C#
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
423 3
|
9月前
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
239 2
|
10月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
159 1
JavaScript中的原型 保姆级文章一文搞懂