nodejs学习
简介
- nodejs是一个事件驱动I/O服务端的JavaScript环境,没有DOM,浏览器之类的东西。
- Chrome的V8引擎是用C++写的,执行JS速度快。
- powershell是功能更强的cmd。
创建服务
创建一个http服务由以下3个部分构成:
- 引入模块,require,把这个模块用一个变量接收。
var xx = require("http");
-
创建服务器
-
处理请求与响应
//创建一个服务 //引入一个模块,把这个模块保存在 _httpv变量当中 var _httpv = require("http"); // console.log(_httpv.createServer) _httpv.createServer(function(request,response){ //http头部的信息 //状态码200 //内容的类型:text/plain(纯文本), text/html(html形式)..., xml response.writeHead(200,{ 'Content-Type':'text/html'}); //向客户端发送数据 response.end("<h1>hello nodejs</h1>"); }).listen(8080); //控制台打印信息 console.log("8080已经创建!")
本质
创建各种服务,通过各种接口,提供各种数据。
基本概念
异步编程
异步编程的直接体现:异步回调的直接体现:异步回调
1.开发语言是js,js本身就是事件驱动的,是异步的;
2.因为是js的,所以是单线程的,现在是多线程的。
通过异步来处理大并发:
阻塞的例子:.readFileSync(文件名)是同步读取文件
// 通过异步来处理大并发(一个阻塞的例子)
//在nodejs中操作文件使用的是fs模块
var _fs = require("fs");
// console.log(_fs.readSync)
//.readFileSync是同步读取文件
var _data = _fs.readFileSync('New Collection.postman_collection.json');
//直接输出会是个二进制的流,此时可以采用toString方法
// console.log(_data);
console.log(_data.toString());
console.log('js已经执行结束');
/*
这种操作在本质上已经形成了阻塞
*/
非阻塞的例子:.readFile()基于回调的异步读取文件
//基于回调的非阻塞的文件读取
var _fs = require('fs');
//第一个参数是要读取的文件名
//第二个参数是处理读取到的文件的内容的回调函数
_fs.readFile('New Collection.postman_collection.json',function(err,_data)){
if(err) return err;
console.log(_data.toString());
};
console.log("----------");
console.log("js已经执行结束!");
/*
我们不需要等待文件读取完成,可以在读取文件的时候同时去执行下面的代码,提高了js的性能。
*/
回调的例子:回调的函数一般是作为最后一个形参出现。
实际工作中,最具体的应用就是jq的$.ajax()。
<!--
在浏览器运行的一个回调的例子
-->
<script type="text/javascript">
function aaa(a,b,callback){
callback(a,b);
}
function num(a,b){
console.log(a+b);
}
aaa(1,2,num);
//在这个例子中,num就是作为回调函数传入aaa中的。
</script>
nodejs的事件(一)
-
nodejs是一个单进程单线程的应用程序,由于V8引擎提供了异步执行回调的接口,通过这些接口处理大的并发请求,性能很高。
-
基本上nodejs所有的事件机制,都是基于设计模式中的“观察者模式”来实现的。
-
nodejs使用事件驱动的模型:每当接收到一个请求,就把它关掉进行处理,当这个请求完成,就把它放到处理队列当中,最后把结果返回给用户。
-
由于nodejs的服务一直都是处理接收请求,但不等待任何的读写操作,所以性能很高,这也叫“非阻塞式的I/O或是事件驱动I/O"。
nodejs的事件是使用 events 模块(require(“events”)),通过实例化( var event = new xx.EventEmitter)它里面的 EventEmitter 类来绑定和监听事件。
-
绑定事件:event.on(…)
-
监听事件:event.emit(…)
node中的js,依然还是那个js,依然是从上到下一行一行的读取的解释型的脚本语言。编写时依然要注意顺序。
/* nodejs 事件 */ var _events = require("events"); //EventEmitter的一个实例 var _EventEmitter = new _events.EventEmitter(); //这里的事件名,完全不同于浏览器的各种事件,这里完全就只是一个标识,它其实是绑定了一个回调函数。 _EventEmitter.on("xx123",function(){ console.log("xx123事件已经被触发"); //事件的嵌套 _EventEmitter.emit("xx456"); }); _EventEmitter.on("xx456",xx456fn