[nodejs]基础知识

Node能做什么和它的优势
  Node核心思想:  1.非阻塞;  2.单线程;  3.事件驱动。
  在目前的web应用中,客户端和服务器端之间有些交互可以认为是基于事件的,那么AJAX就是页面及时响应的关键。每次发送一个请求时(不管请求的数据多么小),都会在网络里走一个来回。服务器必须针对这个请求作出响应,通常是开辟一个新的进程。那么越多用户访问这个页面,所发起的请求个数就会越来越多,就会出现内存溢出、逻辑交错带来的冲突、网络瘫痪、系统崩溃这些问题。
  Node的目标是提供一种构建可伸缩的网络应用的方案,在hello world例子中,服务器可以同时处理很多客户端连接。
  Node和操作系统有一种约定,如果创建了新的链接,操作系统就将通知Node,然后进入休眠。如果有人创建了新的链接,那么它(Node)执行一个回调,每一个链接只占用了非常小的(内存)堆栈开销。   
  举一个简单的异步调用的例子,把test.js和myMydule.js准备好了,^_^。把以下代码拷贝到test.js中并执行:

  var fs = require(‘fs’);
  fs.readFile(‘./myModule.js’, function (err, data) {
    if (err) throw err;
    console.log(‘successfully’);
  });
  console.log(‘async’);

  所谓的异步,大家应该都能想得到运行时会先打先显示”async”,再显示”successfully”。
  Node是无阻塞的,新请求到达服务器时,不需要为这个请求单独作什么事情。Node仅仅是在那里等待请求的发生,有请求就处理请求。
  Node更擅长处理体积小的请求以及基于事件的I/O。
  Node不仅仅是做一个Web服务的框架,它可以做更多,比如它可以做Socket服务,可以做比方说基于文件的,然后基于像一些比方说可以有子进程,然后内部的,它是一个很完整的事件机制,包括一些异步非注射的解决方案,而不仅仅局限在网络一层。同时它可能,即使作为一个Web服务来说,它也提供了更多可以深入这个服务内核、核心的一些功能,比方说Node使用的Http Agent,这块就是它可以更深入这个服务内核来去做一些功能。

Node事件流概念
  因为Node 采用的是事件驱动的模式,其中的很多模块都会产生各种不同的事件,可由模块来添加事件处理方法,所有能够产生事件的对象都是事件模块中的 EventEmitter 类的实例。代码是全世界通用的语言,所以我们还是用代码说话:

  var events = require(“events”);
  var emitter = new events.EventEmitter();
  emitter.on(“myEvent”, function(msg) {
    console.log(msg);
  });
  emitter.emit(“myEvent”, “Hello World.”);

  简单的分析这段:
   1. 使用require()方法添加了events模块并把返回值赋给了一个变量
   2. new events.EventEmitter()这句创建了一个事件触发器,也就是所谓的事件模块中的 EventEmitter 类的实例
   3. on(event, listener)用来为某个事件 event 添加事件处理方法监听器
   4. emit(event, [arg1], [arg2], […]) 方法用来产生事件。以提供的参数作为监听器函数的参数,顺序执行监听器列表中的每个监听器函数。

  EventEmitter 类中的方法都与事件的产生和处理相关:
   1. addListener(event, listener) 和 on(event, listener) 这两个方法都是将一个监听器添加到指定事件的监听器数组的末尾
   2. once(event, listener) 这个方法为事件为添加一次性的监听器。该监听器在事件第一次触发时执行,过后将被移除
   3. removeListener(event, listener) 该方法用来将监听器从指定事件的监听器数组中移除出去
   4. emit(event, [arg1], [arg2], […]) 刚刚提到过了。
  在Node中,存在各式各样不同的数据流,Stream(流)是一个由不同对象实现的抽象接口。例如请求HTTP服务器的request是一个流,类似于stdout(标准输出);包括文件系统、HTTP 请求和响应、以及 TCP/UDP 连接等。流可以是可读的,可写的,或者既可读又可写。所有流都是EventEmitter的实例,因此可以产生各种不同的事件。
  可读流主要会产生以下事件:
• data 当读取到流中的数据时,此事件被触发
• end 当流中没有数据可读时,此事件被触发
• error 当读取数据出现错误时,此事件被触发
• close 当流被关闭时,,此事件被触发,可是并不是所有流都会触发这个事件。(例如,一个连接进入的HTTP request流就不会触发’close’事件。)
  还有一种比较特殊的 fd 事件,当在流中接收到一个文件描述符时触发此事件。只有UNIX流支持这个功能,其他类型的流均不会触发此事件。
  相关详细文档:http://cnodejs.org/cman/all.html#events_

强大的File System 文件系统模块
  Node 中的 fs 模块用来对本地文件系统进行操作。文件的I/O是由标准POSIX函数封装而成。需要使用require(‘fs’)访问这个模块。所有的方法都提供了异步和同步两种方式。
  fs 模块中提供的方法可以用来执行基本的文件操作,包括读、写、重命名、创建和删除目录以及获取文件元数据等。每个操作文件的方法都有同步和异步两个版本。
  异步操作的版本都会使用一个回调方法作为最后一个参数。当操作完成的时候,该回调方法会被调用。而回调方法的第一个参数总是保留为操作时可能出现的异常。如果操作正确成功,则第一个参数的值是 null 或 undefined 。
  同步操作的版本的方法名称则是在对应的异步方法之后加上一个 Sync 作为后缀。比如异步的 rename() 方法的同步版本是 renameSync() 。下面列出来了 fs 模块中的一些常用方法,都只介绍异步操作的版本。
  test.js和myModule.js文件准备好了木?把下面这段代码copy到test.js中执行一次
  var fs = require(‘fs’);
  fs.unlink(‘./myModule.js’, function (err) {
    if (err) throw err;
    console.log(‘successfully deleted myModule.js’);
  });
  如果没有报error,那么myModule.js就被删除了,就是这么简单

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*