nodejs入门总结二:事件驱动
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs入门总结二:事件驱动相关的知识,希望对你有一定的参考价值。
参考技术A Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
events事件模块:
只有一个模块,EventEmitter核心就是事件触发emite,和事件监听on;
应用
(1)const event=require("events")模块
(2)new一个新的对象new evnet.EventEmitter();
(3)on("eventName",function(error,data))创建监听器,一个事件可以创建多个监听
(4)emit("eventName")触发事件
(5)addListener("eventName",function(error,data))也可以监听事件
(6)listenerCount("eventName")获取监听器个数,
getMaxListeners()//获取监听器数量;
setMaxListeners(n)//设置监听器数量;
eventNames() 获取当前触发器实例注册的所有事件名
listeners(事件名称)获取指定事件下的所有监听器
rawListeners(事件名称) 获取指定事件下的所有监听器
(7)移除监听事件的监听器;removeListener("eventName",fun),removeAllListener();off(事件名称,监听器名称)
(8)once():只触发一次,被移除;
(9)prependListener(事件名称,监听器):优先触发,事件监听器;
(10)prependOnceListener(事件名称,监听器) 触发一次 触发后移除
(11)EventEmitter.defaultMaxListeners = 8 每一个触发器实例 同一个事件最多绑定10个监听器 超出报警告
触发器实例上的内部事件
(1)订阅就会触发 newListener
myEmitter.on(\'newListener\',(eventName,listener)=>
console.log( 新增事件$eventName ,listener)
)
(2)移除监听器会触发 removeListener
myEmitter.on(\'removeListener\',(eventName,listener)=>
console.log( 移除事件$eventName ,listener)
)
事件触发,放在调用堆栈中;定时器结束时,函数会被放入“消息队列”中
事件循环会赋予调用堆栈优先级,它首先处理在调用堆栈中找到的所有东西,一旦其中没有任何东西,便开始处理消息队列中的东西。
setTimeout、fetch、或其他的函数是使用的是消息队列:回调函数放在调用堆栈的末尾;
promise,async/await函数使用的是作业队列:前函数结束之前 resolve 的 Promise 会在当前函数之后被立即执行。
process.nextTick(fun):事件循环进行一次完整行程时我们成为一个滴答,传入的函数则指示引擎在当前操作结束(在下一个事件循环滴答开始之前)时调用此函数:
回掉函数的第一个参数是err,如果正确返回null;
Nodejs入门级基础+实战
这篇随笔将会按序记录如下内容:
-
NodeJs 简介 安装
-
NodeJs HTTP 模块、URL 模块
-
CommonJs 和 Nodejs 中自定义模块
-
NodeJs FS 模块
-
利用 HTTP 模块 URl 模块 PATH 模块 FS模块创建一个 WEB 服务器(基础实战)
- 关于Node.js的非阻塞IO,异步,事件驱动基础
cnpm淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org
1.NodeJs简介 安装 开发工具配置
Nodejs介绍
Node优势
I.NodeJs 语法完全是 js 语法,只要懂 JS 基础就可以学会 Nodejs 后端开发。
这打破了过去 JavaScript 只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低开发成本。
II.NodeJs 超强的高并发能力。
Node.js 的首要目标是提供一种简单的、用于创建高性能服务器及可在该服务器中运行的各种应用程序的开发工具。在 Java、PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右,而Node.js 不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。使用 Node.js,一个 8GB内存的服务器,可以同时处理超过 4 万用户的连接。
III.实现高性能服务器。
严格地说,Node.js 是一个用于开发各种 Web 服务器的开发工具。在 Node.js 服务器中,运行的是高性能 V8JavaScript 脚本语言,该语言是一种可以运行在服务器端的 JavaScript 脚本语言。那么,什么是 V8 JavaScript 脚本语言呢?该语言是一种被 V8 JavaScript 引擎所解析并执行的脚本语言。V8JavaScript 引擎是由 Google 公司使用 C++语言开发的一种高性能 JavaScript 引擎,该引擎并不局限于在浏览器中运行。Node.js 将其转用在了服务器中,并且为其提供了许多附加的具有各种不同用途的 API。例如,在一个服务器中,经常需要处理各种二进制数据。在 JavaScript 脚本语言中,只具有非常有限的对二进制数据的处理能力,而 Node.js 所提供的 Buffer 类则提供了丰富的对二进制数据的处理能力。另外,在 V8 JavaScript 引擎内部使用一种全新的编译技术。这意味着开发者编写的高端的 JavaScript 脚本代码与开发者编写的低端的 C语言具有非常相近的执行效率,这也是 Node.js 服务器可以提供的一个重要特性。
Node环境的搭建
2.NodeJs HTTP 模块、URL 模块
I.Node.js 创建第一个应用
var http = require("http");
var http = require(‘http‘); http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK //设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf8 response.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); // 发送响应数据 "Hello World" res.end("这是第一个node应用"); }).listen(3000);
node xxx.js
II.HTTP 模块、URL 模块
//引用模块 var http = require("http"); //创建一个服务器,回调函数表示接收到请求之后做的事情 var server = http.createServer(function(req,res){ //req 参数表示请求,res 表示响应 console.log("服务器接收到了请求" + req.url); res.end(); // End 方法使 Web 服务器停止处理脚本并返回当前结果 }); //监听端口 server.listen(3000);
设置一个响应头
//引用模块 var http = require("http"); //创建一个服务器,回调函数表示接收到请求之后做的事情 var server = http.createServer(function(req,res){ //req 参数表示请求,res 表示响应 res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});//插入响应头 console.log("服务器接收到了请求" + req.url); res.end(); // End 方法使 Web 服务器停止处理脚本并返回当前结果 }); //监听端口 server.listen(3000);
2.URL 模块的使用
url.parse() //解析 URL url.format(urlObject) //是上面 url.parse() 操作的逆向操作 url.resolve(from, to) //添加或者替换地址
3.CommonJs 和 Nodejs 中自定义模块
什么是Common.js
Nodejs 中的模块化
// 定义一个 tools.js 的模块 //模块定义 var tools = { sayHello: function() { return ‘hello NodeJS‘; }, add: function(x, y) { return x + y; } }; // 模块接口的暴露 // module.exports = tools; exports.sayHello = tools.sayHello; exports.add = tools.add;
var http = require(‘http‘); // 引入自定义的 tools.js 模块 var tools= require(‘./tools‘); tools.sayHello(); //使用模块
npm init 生成 package.json
npm init
package.json内保存了应用信息,比如版本,依赖,环境等。
4.NodeJs FS 模块
!使用前先引入fs模块
const fs = require(‘fs‘)
fs.stat(‘hello.js‘, (error, stats) =>{ if(error){ console.log(error) } else { console.log(stats) console.log(`文件:${stats.isFile()}`) console.log(`目录:${stats.isDirectory()}`) } })
const fs = require(‘fs‘) fs.mkdir(‘logs‘, (error) => { if(error){ console.log(error) } else { console.log(‘成功创建目录:logs‘) } })
fs.writeFile(‘logs/hello.log‘, ‘您好 ~ ‘, (error) => { if(error) { console.log(error) } else { console.log(‘成功写入文件‘) } })
fs.appendFile(‘logs/hello.log‘, ‘hello ~ ‘, (error) => { if(error) { console.log(error) } else { console.log(‘成功写入文件‘) } })
const fs = require(‘fs‘) fs.readFile(‘logs/hello.log‘, ‘utf8‘, (error, data) =>{ if (error) { console.log(error) } else { console.log(data) } })
const fs = require(‘fs‘) fs.readdir(‘logs‘, (error, files) => { if (error) { console.log(error) } else { console.log(files) } })
const fs = require(‘fs‘) fs.rename(‘js/hello.log‘, ‘js/greeting.log‘, (error) =>{ if (error) { console.log(error) } else { console.log(‘重命名成功‘) } })
fs.rmdir(‘logs‘, (error) =>{ if (error) { console.log(error) } else { console.log(‘成功的删除了目录:logs‘) } })
fs.unlink(`logs/${file}`, (error) => { if (error) { console.log(error) } else { console.log(`成功的删除了文件: ${file}`) } })
const fs = require(‘fs‘) var fileReadStream = fs.createReadStream(‘data.json‘) let count=0; var str=‘‘; fileReadStream.on(‘data‘, (chunk) => { console.log(`${ ++count } 接收到:${chunk.length}`); str+=chunk }) fileReadStream.on(‘end‘, () => { console.log(‘--- 结束 ---‘); console.log(count); console.log(str); }) fileReadStream.on(‘error‘, (error) => { console.log(error) })
var fs = require("fs"); var data = ‘我是从数据库获取的数据,我要保存起来‘; // 创建一个可以写入的流,写入到文件 output.txt 中 var writerStream = fs.createWriteStream(‘output.txt‘); // 使用 utf8 编码写入数据 writerStream.write(data,‘UTF8‘); // 标记文件末尾 writerStream.end(); // 处理流事件 --> finish 事件 writerStream.on(‘finish‘, function() { /*finish - 所有数据已被写入到底层系统时触发。*/ console.log("写入完成。"); }); writerStream.on(‘error‘, function(err){ console.log(err.stack); }); console.log("程序执行完毕");
var fs = require("fs"); // 创建一个可读流 var readerStream = fs.createReadStream(‘input.txt‘); // 创建一个可写流 var writerStream = fs.createWriteStream(‘output.txt‘); // 管道读写操作 // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中 readerStream.pipe(writerStream); console.log("程序执行完毕");
5.Node.js 搭建静态WEB服务器
待更新
以上是关于nodejs入门总结二:事件驱动的主要内容,如果未能解决你的问题,请参考以下文章