最新版本号[免费下载]
  • Node.js 事件循环
    Node.js 事件循环

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    ,220)/}

    循环,事件,
    2015-11-24

    170

  • Node.js EventEmitter
    Node.js EventEmitter

    EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。

    当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

    让我们以下面的例子解释这个过程:

    //event.js 文件
    var events = require('events'); 
    var emitter = new events.EventEmitter(); 
    emitter.on('someEvent', function(arg1, arg2) { 
    	console.log('listener1', arg1, arg2); 
    }); 
    emitter.on('someEvent', function(arg1, arg2) { 
    	console.log('listener2', arg1, arg2); 
    }); 
    emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

    执行以上代码,运行的结果如下:/p>

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node event.js  listener1 arg1 参数 arg2 参数 listener2 arg1 参数 arg2 参数

    以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。

    运行结果中可以看到两个事件监听器回调函数被先后调用。 这就是EventEmitter最简单的用法。

    EventEmitter 提供了多个属性,如 on 和 emiton 函数用于绑定事件函数,emit 属性用于触发一个事件。接下来我们来具体看下 EventEmitter 的属性介绍。

    方法

    序号方法 & 描述
    1addListener(event, listener)
    为指定事件添加一个监听器到监听器数组的尾部。
    2on(event, listener)
    为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
    server.on('connection', function (stream) {
      console.log('someone connected!');
    });
    3once(event, listener)
    为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
    server.once('connection', function (stream) {
      console.log('Ah, we have our first user!');
    });
    4removeListener(event, listener)
    移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器。
    var callback = function(stream) {
      console.log('someone connected!');
    };
    server.on('connection', callback);
    // ...
    server.removeListener('connection', callback);
    5removeAllListeners([event])
    移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
    6setMaxListeners(n)
    默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
    7listeners(event)
    返回指定事件的监听器数组。
    8emit(event, [arg1], [arg2], [...])
    按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

    类方法

    序号方法 & 描述
    1listenerCount(emitter, event)
    返回指定事件的监听器数量。

    事件

    序号事件 & 描述
    1newListener
    • event - 字符串,事件名称

    • listener - 处理事件函数

    该事件在添加新监听器时被触发。

    2removeListener
    • event - 字符串,事件名称

    • listener - 处理事件函数

    从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。

    实例

    以下实例通过 connection(连接)事件演示了 EventEmitter 类的应用。

    创建 main.js 文件,代码如下:

    var events = require('events');
    var eventEmitter = new events.EventEmitter();
    
    // 监听器 #1
    var listner1 = function listner1() {
       console.log('监听器 listner1 执行。');
    }
    
    // 监听器 #2
    var listner2 = function listner2() {
      console.log('监听器 listner2 执行。');
    }
    
    // 绑定 connection 事件,处理函数为 listner1 
    eventEmitter.addListener('connection', listner1);
    
    // 绑定 connection 事件,处理函数为 listner2
    eventEmitter.on('connection', listner2);
    
    var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
    console.log(eventListeners + " 监听器监听连接事件。");
    
    // 处理 connection 事件 
    eventEmitter.emit('connection');
    
    // 移除监绑定的 listner1 函数
    eventEmitter.removeListener('connection', listner1);
    console.log("listner1 不再受监听。");
    
    // 触发连接事件
    eventEmitter.emit('connection');
    
    eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
    console.log(eventListeners + " 监听器监听连接事件。");
    
    console.log("程序执行完毕。");

    以上代码,执行结果如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js 2 监听器监听连接事件。 监听器 listner1 执行。 监听器 listner2 执行。 listner1 不再受监听。 监听器 listner2 执行。 1 监听器监听连接事件。 程序执行完毕。

    error 事件

    EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。

    当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。

    我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:

    var events = require('events'); 
    var emitter = new events.EventEmitter(); 
    emitter.emit('error');

    运行时会显示以下错误:

    node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
    ^ 
    Error: Uncaught, unspecified 'error' event. 
    at EventEmitter.emit (events.js:50:15) 
    at Object.<anonymous> (/home/byvoid/error.js:5:9) 
    at Module._compile (module.js:441:26) 
    at Object..js (module.js:459:10) 
    at Module.load (module.js:348:31) 
    at Function._load (module.js:308:12) 
    at Array.0 (module.js:479:10) 
    at EventEmitter._tickCallback (node.js:192:40)

    继承 EventEmitter

    大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。

    为什么要这样做呢?原因有两点:

    首先,具有某个实体功能的对象实现事件符合语义, 事件的监听和发射应该是一个对象的方法。

    其次 JavaScript 的对象机制是基于原型的,支持 部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。


    ,220)/}

    2015-11-24

    196

  • Node.js Buffer(缓冲区)
    Node.js Buffer(缓冲区)

    将 Buffer 转换为 JSON 对象

    语法

    将 Node Buffer 转换为 JSON 对象的函数语法格式如下:

    buf.toJSON()

    返回值

    返回 JSON 对象。

    实例

    var buf = new Buffer('www.runoob.com');var json = buf.toJSON(buf);console.log(json);

    执行以上代码,输出结果为:

    [ 119, 119, 119, 46, 114, 117, 110, 111, 111, 98, 46, 99, 111, 109 ]

    缓冲区合并

    语法

    Node 缓冲区合并的语法如下所示:

    Buffer.concat(list[, totalLength])

    参数

    参数描述如下:

    • list - 用于合并的 Buffer 对象数组列表。

    • totalLength - 指定合并后Buffer对象的总长度。

    返回值

    返回一个多个成员合并的新 Buffer 对象。

    实例

    var buffer1 = new Buffer('菜鸟教程 ');var buffer2 = new Buffer('www.runoob.com');var buffer3 = Buffer.concat([buffer1,buffer2]);console.log("buffer3 内容: " + buffer3.toString());

    执行以上代码,输出结果为:

    buffer3 内容: 菜鸟教程 www.runoob.com

    缓冲区比较

    语法

    Node Buffer 比较的函数语法如下所示:

    buf.compare(otherBuffer);

    参数

    参数描述如下:

    • otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象。

    返回值

    返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。

    实例

    var buffer1 = new Buffer('ABC');var buffer2 = new Buffer('ABCD');var result = buffer1.compare(buffer2);if(result < 0) {
       console.log(buffer1 + " 在 " + buffer2 + "之前");}else if(result == 0){
       console.log(buffer1 + " 与 " + buffer2 + "相同");}else {
       console.log(buffer1 + " 在 " + buffer2 + "之后");}

    执行以上代码,输出结果为:

    ABC在ABCD之前

    拷贝缓冲区

    语法

    Node 缓冲区拷贝语法如下所示:

    buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

    参数

    参数描述如下:

    • targetBuffer - 要拷贝的 Buffer 对象。

    • targetStart - 数字, 可选, 默认: 0

    • sourceStart - 数字, 可选, 默认: 0

    • sourceEnd - 数字, 可选, 默认: buffer.length

    返回值

    没有返回值。

    实例

    var buffer1 = new Buffer('ABC');// 拷贝一个缓冲区var buffer2 = new Buffer(3);buffer1.copy(buffer2);console.log("buffer2 content: " + buffer2.toString());

    执行以上代码,输出结果为:

    buffer2 content: ABC

    缓冲区裁剪

    Node 缓冲区裁剪语法如下所示:

    buf.slice([start][, end])

    参数

    参数描述如下:

    • start - 数字, 可选, 默认: 0

    • end - 数字, 可选, 默认: buffer.length

    返回值

    返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。

    实例

    var buffer1 = new Buffer('runoob');// 剪切缓冲区var buffer2 = buffer1.slice(0,2);console.log("buffer2 content: " + buffer2.toString());

    执行以上代码,输出结果为:

    buffer2 content: ru

    缓冲区长度

    语法

    Node 缓冲区长度计算语法如下所示:

    buf.length;

    返回值

    返回 Buffer 对象所占据的内存长度。

    实例

    var buffer = new Buffer('www.runoob.com');//  缓冲区长度console.log("buffer length: " + buffer.length);

    执行以上代码,输出结果为:

    buffer length: 14

    方法参考手册

    以下列出了 Node.js Buffer 模块常用的方法(注意有些方法在旧版本是没有的):

    序号方法 & 描述
    1new Buffer(size) 
    分配一个新的 size 大小单位为8位字节的 buffer。 注意, size 必须小于 kMaxLength,否则,将会抛出异常 RangeError。
    2new Buffer(buffer) 
    拷贝参数 buffer 的数据到 Buffer 实例。
    3new Buffer(str[, encoding])
    分配一个新的 buffer ,其中包含着传入的 str 字符串。 encoding 编码方式默认为 'utf8'。
    4buf.length
    返回这个 buffer 的 bytes 数。注意这未必是 buffer 里面内容的大小。length 是 buffer 对象所分配的内存数,它不会随着这个 buffer 对象内容的改变而改变。
    5buf.write(string[, offset][, length][, encoding])
    根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 string 数据写入buffer。 offset 偏移量默认值是 0, encoding 编码方式默认是 utf8。 length 长度是将要写入的字符串的 bytes 大小。 返回 number 类型,表示写入了多少 8 位字节流。如果 buffer 没有足够的空间来放整个 string,它将只会只写入部分字符串。 length 默认是 buffer.length - offset。 这个方法不会出现写入部分字符。
    6buf.writeUIntLE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算,例如:
    var b = new Buffer(6);b.writeUIntBE(0x1234567890ab, 0, 6);// <Buffer 12 34 56 78 90 ab>
    noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    7buf.writeUIntBE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    8buf.writeIntLE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    9buf.writeIntBE(value, offset, byteLength[, noAssert])
    将value 写入到 buffer 里, 它由offset 和 byteLength 决定,支持 48 位计算。noAssert 值为 true 时,不再验证 value 和 offset 的有效性。 默认是 false。
    10buf.readUIntLE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    11buf.readUIntBE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    12buf.readIntLE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    13buf.readIntBE(offset, byteLength[, noAssert])
    支持读取 48 位以下的数字。noAssert 值为 true 时, offset 不再验证是否超过 buffer 的长度,默认为 false。
    14buf.toString([encoding][, start][, end])
    根据 encoding 参数(默认是 'utf8')返回一个解码过的 string 类型。还会根据传入的参数 start (默认是 0) 和 end (默认是 buffer.length)作为取值范围。
    15buf.toJSON()
    将 Buffer 实例转换为 JSON 对象。
    16buf[index]
    获取或设置指定的字节。返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至 255。
    17buf.equals(otherBuffer)
    比较两个缓冲区是否相等,如果是返回 true,否则返回 false。
    18buf.compare(otherBuffer)
    比较两个 Buffer 对象,返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。
    19buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])
    buffer 拷贝,源和目标可以相同。 targetStart 目标开始偏移和 sourceStart 源开始偏移默认都是 0。 sourceEnd 源结束位置偏移默认是源的长度 buffer.length 。
    20buf.slice([start][, end])
    剪切 Buffer 对象,根据 start(默认是 0 ) 和 end (默认是 buffer.length ) 偏移和裁剪了索引。 负的索引是从 buffer 尾部开始计算的。
    21buf.readUInt8(offset[, noAssert])
    根据指定的偏移量,读取一个有符号 8 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 如果这样 offset 可能会超出buffer 的末尾。默认是 false。
    22buf.readUInt16LE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 字节序格式读取一个有符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    23buf.readUInt16BE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 字节序格式读取一个有符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    24buf.readUInt32LE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    25buf.readUInt32BE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    26buf.readInt8(offset[, noAssert])
    根据指定的偏移量,读取一个 signed 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    27buf.readInt16LE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 格式读取一个 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    28buf.readInt16BE(offset[, noAssert])
    根据指定的偏移量,使用特殊的 endian 格式读取一个 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
    29buf.readInt32LE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    30buf.readInt32BE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    31buf.readFloatLE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位浮点数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
    32buf.readFloatBE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位浮点数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
    33buf.readDoubleLE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位double。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    34buf.readDoubleBE(offset[, noAssert])
    根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位double。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
    35buf.writeUInt8(value, offset[, noAssert])
    根据传入的 offset 偏移量将 value 写入 buffer。注意:value 必须是一个合法的有符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则不要使用。默认是 false。
    36buf.writeUInt16LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的有符号 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    37buf.writeUInt16BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的有符号 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    38buf.writeUInt32LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入buffer。注意:value 必须是一个合法的有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    39buf.writeUInt32BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入buffer。注意:value 必须是一个合法的有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    40buf.writeInt8(value, offset[, noAssert])<br根据传入的 offset="" 偏移量将="" value="" 写入="" buffer="" 。注意:value="" 必须是一个合法的="" signed="" 8="" 位整数。="" 若参数="" noassert="" 为="" true="" 将不会验证="" 和="" 偏移量参数。="" 这意味着="" 可能过大,或者="" 可能会超出="" 的末尾从而造成="" 被丢弃。="" 除非你对这个参数非常有把握,否则尽量不要使用。默认是="" false。<="" td="">
    41buf.writeInt16LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
    42buf.writeInt16BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
    43buf.writeInt32LE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    44buf.writeInt32BE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    45buf.writeFloatLE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    46buf.writeFloatBE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    47buf.writeDoubleLE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    48buf.writeDoubleBE(value, offset[, noAssert])
    根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
    49buf.fill(value[, offset][, end])
    使用指定的 value 来填充这个 buffer。如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer。


    ,220)/}

    缓冲区,
    2015-11-24

    137

  • Node.js Stream(流)
    Node.js Stream(流)

    查看 output.txt 文件的内容:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;cat output.txt  菜鸟教程官网地址:www.runoob.com

    管道流

    管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。


    如上面的图片所示,我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。

    以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。

    设置 input.txt 文件内容如下:

    菜鸟教程官网地址:www.runoob.com
    管道流操作实例

    创建 main.js 文件, 代码如下:

    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("程序执行完毕");

    代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js  程序执行完毕

    查看 output.txt 文件的内容:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;cat output.txt  菜鸟教程官网地址:www.runoob.com 管道流操作实例

    链式流

    链式是通过连接输出流到另外一个流并创建多个对个流操作链的机制。链式流一般用于管道操作。

    接下来我们就是用管道和链式来压缩和解压文件。

    创建 compress.js 文件, 代码如下:

    var fs = require("fs");
    var zlib = require('zlib');
    
    // 压缩 input.txt 文件为 input.txt.gz
    fs.createReadStream('input.txt')
      .pipe(zlib.createGzip())
      .pipe(fs.createWriteStream('input.txt.gz'));
      
    console.log("文件压缩完成。");

    代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node compress.js  文件压缩完成。

    执行完以上操作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。

    接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:

    var fs = require("fs");
    var zlib = require('zlib');
    
    // 解压 input.txt.gz 文件为 input.txt
    fs.createReadStream('input.txt.gz')
      .pipe(zlib.createGunzip())
      .pipe(fs.createWriteStream('input.txt'));
      
    console.log("文件解压完成。");


    ,220)/}

    2015-11-24

    128

  • Node.js模块系统
    Node.js模块系统

    2015-11-24

    116

  • Node.js 函数
    Node.js 函数

    2015-11-24

    79

  • Node.js 路由
    Node.js 路由

    2015-11-24

    106

  • Node.js 全局对象
    Node.js 全局对象

    __dirname

    __dirname 表示当前执行脚本所在的目录。

    实例

    创建文件 main.js ,代码如下所示:

    // 输出全局变量 __dirname 的值console.log( __dirname );

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js/web/com/runoob/nodejs

    setTimeout(cb, ms)

    setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数。

    返回一个代表定时器的句柄值。

    实例

    创建文件 main.js ,代码如下所示:

    function printHello(){
       console.log( "Hello, World!");}// 两秒后执行以上函数setTimeout(printHello, 2000);

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.jsHello, World!

    clearTimeout(t)

    clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的计算器。

    实例

    创建文件 main.js ,代码如下所示:

    function printHello(){
       console.log( "Hello, World!");}// 两秒后执行以上函数var t = setTimeout(printHello, 2000);// 清除定时器clearTimeout(t);

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js

    setInterval(cb, ms)

    setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。

    返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。

    setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。

    实例

    创建文件 main.js ,代码如下所示:

    function printHello(){
       console.log( "Hello, World!");}// 两秒后执行以上函数setInterval(printHello, 2000);

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js

    Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! ……

    以上程序每隔两秒就会输出一次"Hello, World!",且会永久执行下去,直到你按下 ctrl + c 按钮。


    console

    console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的事实标准。

    Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。

    console 方法

    以下为 console 对象的方法:

    序号方法 & 描述
    1console.log([data][, ...])
    向标准输出流打印字符并以换行符结束。该方法接收若干 个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则 以类似于C 语言 printf() 命令的格式输出。
    2console.info([data][, ...])
    P该命令的作用是返回信息性消息,这个命令与console.log差别并不大,除了在chrome中只会输出文字外,其余的会显示一个蓝色的惊叹号。
    3console.error([data][, ...])
    输出错误消息的。控制台在出现错误时会显示是红色的叉子。
    4console.warn([data][, ...])
    输出警告消息。控制台出现有黄色的惊叹号。
    5console.dir(obj[, options])
    用来对一个对象进行检查(inspect),并以易于阅读和打印的格式显示。
    6console.time(label)
    输出时间,表示计时开始。
    7console.timeEnd(label)
    结束时间,表示计时结束。
    8console.trace(message[, ...])
    当前执行的代码在堆栈中的调用路径,这个测试函数运行很有帮助,只要给想测试的函数里面加入 console.trace 就行了。
    9console.assert(value[, message][, ...])
    用于判断某个表达式或变量是否为真,接手两个参数,第一个参数是表达式,第二个参数是字符串。只有当第一个参数为false,才会输出第二个参数,否则不会有任何结果。

    console.log():向标准输出流打印字符并以换行符结束。


    console.log 接受若干 个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则 以类似于C 语言 printf() 命令的格式输出。

    第一个参数是一个字符串,如果没有 参数,只打印一个换行。

    console.log('Hello world'); console.log('byvoid%diovyb'); console.log('byvoid%diovyb', 1991);

    运行结果为:

    Hello world 
    byvoid%diovyb 
    byvoid1991iovyb
    • console.error():与console.log() 用法相同,只是向标准错误流输出。

    • console.trace():向标准错误流输出当前的调用栈。

    console.trace();

    运行结果为:

    Trace: at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallback (node.js:192:40)

    实例

    创建文件 main.js ,代码如下所示:

    console.info("程序开始执行:");var counter = 10;console.log("计数: %d", counter);console.time("获取数据");//// 执行一些代码// console.timeEnd('获取数据');console.info("程序执行完毕。")

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js程序开始执行:计数: 10获取数据: 0ms程序执行完毕

    process

    process 是一个全局变量,即 global 对象的属性。

    它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。通常在你写本地命令行程序的时候,少不了要 和它打交道。下面将会介绍 process 对象的一些最常用的成员方法。

    序号事件 & 描述
    1exit
    当进程准备退出时触发。
    2beforeExit
    当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可以异步调用,这样 node 就会继续执行。
    3uncaughtException
    当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。
    4Signal 事件
    当进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等。

    实例

    创建文件 main.js ,代码如下所示:

    process.on('exit', function(code) {
    
      // 以下代码永远不会执行
      setTimeout(function() {
        console.log("该代码不会执行");
      }, 0);
      
      console.log('退出码为:', code);});console.log("程序执行结束");

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js程序执行结束退出码为: 0

    退出状态码

    退出状态码如下所示:

    状态码名称 & 描述
    1Uncaught Fatal Exception
    有未捕获异常,并且没有被域或 uncaughtException 处理函数处理。
    2Unused
    保留
    3Internal JavaScript Parse Error
    JavaScript的源码启动 Node 进程时引起解析错误。非常罕见,仅会在开发 Node 时才会有。
    4Internal JavaScript Evaluation Failure
    JavaScript 的源码启动 Node 进程,评估时返回函数失败。非常罕见,仅会在开发 Node 时才会有。
    5Fatal Error
    V8 里致命的不可恢复的错误。通常会打印到 stderr ,内容为: FATAL ERROR
    6Non-function Internal Exception Handler
    未捕获异常,内部异常处理函数不知为何设置为on-function,并且不能被调用。
    7Internal Exception Handler Run-Time Failure
    未捕获的异常, 并且异常处理函数处理时自己抛出了异常。例如,如果 process.on('uncaughtException') 或 domain.on('error') 抛出了异常。
    8Unused
    保留
    9Invalid Argument
    可能是给了未知的参数,或者给的参数没有值。
    10Internal JavaScript Run-Time Failure
    JavaScript的源码启动 Node 进程时抛出错误,非常罕见,仅会在开发 Node 时才会有。
    12Invalid Debug Argument 
    设置了参数--debug 和/或 --debug-brk,但是选择了错误端口。
    >128Signal Exits
    如果 Node 接收到致命信号,比如SIGKILL 或 SIGHUP,那么退出代码就是128 加信号代码。这是标准的 Unix 做法,退出信号代码放在高位。

    Process 属性

    Process 提供了很多有用的属性,便于我们更好的控制系统的交互:

    序号.属性 & 描述
    1stdout
    标准输出流。
    2stderr
    标准错误流。
    3stdin
    标准输入流。
    4argv
    argv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是node,第二个成员是脚本文件名,其余成员是脚本文件的参数。
    5execPath
    返回执行当前脚本的 Node 二进制文件的绝对路径。
    6execArgv
    返回一个数组,成员是命令行下执行脚本时,在Node可执行文件与脚本文件之间的命令行参数。
    7env
    返回一个对象,成员为当前 shell 的环境变量
    8exitCode
    进程退出时的代码,如果进程优通过 process.exit() 退出,不需要指定退出码。
    9version
    Node 的版本,比如v0.10.18。
    10versions
    一个属性,包含了 node 的版本和依赖.
    11config
    一个包含用来编译当前 node 执行文件的 javascript 配置选项的对象。它与运行 ./configure 脚本生成的 "config.gypi" 文件相同。
    12pid
    当前进程的进程号。
    13title
    进程名,默认值为"node",可以自定义该值。
    14arch
    当前 CPU 的架构:'arm'、'ia32' 或者 'x64'。
    15platform
    运行程序所在的平台系统 'darwin', 'freebsd', 'linux', 'sunos' 或 'win32'
    16mainModule
    require.main 的备选方法。不同点,如果主模块在运行时改变,require.main可能会继续返回老的模块。可以认为,这两者引用了同一个模块。

    实例

    创建文件 main.js ,代码如下所示:

    // 输出到终端process.stdout.write("Hello World!" + "\n");// 通过参数读取process.argv.forEach(function(val, index, array) {
       console.log(index + ': ' + val);});// 获取执行路局console.log(process.execPath);// 平台信息console.log(process.platform);

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.jsHello World!0: node1: /web/www/node/main.js/usr/local/node/0.10.36/bin/node darwin

    方法参考手册

    Process 提供了很多有用的方法,便于我们更好的控制系统的交互:

    序号方法 & 描述
    1abort()
    这将导致 node 触发 abort 事件。会让 node 退出并生成一个核心文件。
    2chdir(directory)
    改变当前工作进程的目录,如果操作失败抛出异常。
    3cwd()
    返回当前进程的工作目录
    4exit([code])
    使用指定的 code 结束进程。如果忽略,将会使用 code 0。
    5getgid()
    获取进程的群组标识(参见 getgid(2))。获取到得时群组的数字 id,而不是名字。
    注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
    6setgid(id)
    设置进程的群组标识(参见 setgid(2))。可以接收数字 ID 或者群组名。如果指定了群组名,会阻塞等待解析为数字 ID 。
    注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
    7getuid()
    获取进程的用户标识(参见 getuid(2))。这是数字的用户 id,不是用户名。
    注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
    8setuid(id)
    设置进程的用户标识(参见setuid(2))。接收数字 ID或字符串名字。果指定了群组名,会阻塞等待解析为数字 ID 。
    注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
    9getgroups()
    返回进程的群组 iD 数组。POSIX 系统没有保证一定有,但是 node.js 保证有。
    注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
    10setgroups(groups)
    设置进程的群组 ID。这是授权操作,所有你需要有 root 权限,或者有 CAP_SETGID 能力。
    注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
    11initgroups(user, extra_group)
    读取 /etc/group ,并初始化群组访问列表,使用成员所在的所有群组。这是授权操作,所有你需要有 root 权限,或者有 CAP_SETGID 能力。
    注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
    12kill(pid[, signal])
    发送信号给进程. pid 是进程id,并且 signal 是发送的信号的字符串描述。信号名是字符串,比如 'SIGINT' 或 'SIGHUP'。如果忽略,信号会是 'SIGTERM'。
    13memoryUsage()
    返回一个对象,描述了 Node 进程所用的内存状况,单位为字节。
    14nextTick(callback)
    一旦当前事件循环结束,调用回到函数。
    15umask([mask])
    设置或读取进程文件的掩码。子进程从父进程继承掩码。如果mask 参数有效,返回旧的掩码。否则,返回当前掩码。
    16uptime()
    返回 Node 已经运行的秒数。
    17hrtime()
    返回当前进程的高分辨时间,形式为 [seconds, nanoseconds]数组。它是相对于过去的任意事件。该值与日期无关,因此不受时钟漂移的影响。主要用途是可以通过精确的时间间隔,来衡量程序的性能。
    你可以将之前的结果传递给当前的 process.hrtime() ,会返回两者间的时间差,用来基准和测量时间间隔。

    实例

    创建文件 main.js ,代码如下所示:

    // 输出当前目录console.log('当前目录: ' + process.cwd());// 输出当前版本console.log('当前版本: ' + process.version);// 输出内存使用情况console.log(process.memoryUsage());

    执行 main.js 文件,代码如下所示:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node main.js当前目录: /web/com/runoob/nodejs当前版本: v0.10.36{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }


    ,220)/}

    全局,对象,
    2015-11-24

    124

  • Node.js 常用工具
    Node.js 常用工具

    2015-11-24

    92

  • Node.js 文件系统
    Node.js 文件系统

    接下来,让我们来具体了解下 Node.js 文件系统的方法。


    打开文件

    语法

    以下为在异步模式下打开文件的语法格式:

    fs.open(path, flags[, mode], callback)

    参数

    参数使用说明如下:

    • path - 文件的路径。

    • flags - 文件打开的行为。具体值详见下文。

    • mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。

    • callback - 回调函数,带有两个参数如:callback(err, fd)。

    flags 参数可以是以下值:

    Flag描述
    r以读取模式打开文件。如果文件不存在抛出异常。
    r+以读写模式打开文件。如果文件不存在抛出异常。
    rs以同步的方式读取文件。
    rs+以同步的方式读取和写入文件。
    w以写入模式打开文件,如果文件不存在则创建。
    wx类似 'w',但是如果文件路径不存在,则文件写入失败。
    w+以读写模式打开文件,如果文件不存在则创建。
    wx+类似 'w+', 但是如果文件路径不存在,则文件读写失败。
    a以追加模式打开文件,如果文件不存在则创建。
    ax类似 'a', 但是如果文件路径不存在,则文件追加失败。
    a+以读取追加模式打开文件,如果文件不存在则创建。
    ax+类似 'a+', 但是如果文件路径不存在,则文件读取追加失败。

    实例

    接下来我们创建 file.js 文件,并打开 input.txt 文件进行读写,代码如下所示:

    var fs = require("fs");// 异步打开文件console.log("准备打开文件!");fs.open('input.txt', 'r+', function(err, fd) {
       if (err) {
           return console.error(err);
       }
      console.log("文件打开成功!");     });

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备打开文件!文件打开成功!

    获取文件信息

    语法

    以下为通过异步模式获取文件信息的语法格式:

    fs.stat(path, callback)

    参数

    参数使用说明如下:

    • path - 文件路径。

    • callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。

    fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。例如判断是否为文件:

    var fs = require('fs');fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
        console.log(stats.isFile()); 		//true})

    stats类中的方法有:

    方法描述
    stats.isFile()如果是文件返回 true,否则返回 false。
    stats.isDirectory()如果是目录返回 true,否则返回 false。
    stats.isBlockDevice()如果是块设备返回 true,否则返回 false。
    stats.isCharacterDevice()如果是字符设备返回 true,否则返回 false。
    stats.isSymbolicLink()如果是软链接返回 true,否则返回 false。
    stats.isFIFO()如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
    stats.isSocket()如果是 Socket 返回 true,否则返回 false。

    实例

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");console.log("准备打开文件!");fs.stat('input.txt', function (err, stats) {
       if (err) {
           return console.error(err);
       }
       console.log(stats);
       console.log("读取文件信息成功!");
       
       // 检测文件类型
       console.log("是否为文件(isFile) ? " + stats.isFile());
       console.log("是否为目录(isDirectory) ? " + stats.isDirectory());    });

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备打开文件!{ dev: 16777220,   mode: 33188,   nlink: 1,   uid: 501,   gid: 20,   rdev: 0,   blksize: 4096,   ino: 40333161,   size: 61,   blocks: 8,   atime: Mon Sep 07 2015 17:43:55 GMT+0800 (CST),   mtime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST),   ctime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST) }读取文件信息成功!是否为文件(isFile) ? true是否为目录(isDirectory) ? false

    写入文件

    语法

    以下为异步模式下写入文件的语法格式:

    fs.writeFile(filename, data[, options], callback)

    如果文件存在,该方法写入的内容会覆盖旧的文件内容。

    参数

    参数使用说明如下:

    • path - 文件路径。

    • data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。

    • options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'

    • callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。

    实例

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");console.log("准备写入文件");fs.writeFile('input.txt', '我是通过写入的文件内容!',  function(err) {
       if (err) {
           return console.error(err);
       }
       console.log("数据写入成功!");
       console.log("--------我是分割线-------------")
       console.log("读取写入的数据!");
       fs.readFile('input.txt', function (err, data) {
          if (err) {
             return console.error(err);
          }
          console.log("异步读取文件数据: " + data.toString());
       });});

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备写入文件数据写入成功!--------我是分割线-------------读取写入的数据!异步读取文件数据: 我是通过写入的文件内容

    读取文件

    语法

    以下为异步模式下读取文件的语法格式:

    fs.read(fd, buffer, offset, length, position, callback)

    该方法使用了文件描述符来读取文件。

    参数

    参数使用说明如下:

    • fd - 通过 fs.open() 方法返回的文件描述符。

    • buffer - 数据写入的缓冲区。

    • offset - 缓冲区写入的写入偏移量。

    • length - 要从文件中读取的字节数。

    • position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。

    • callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

    实例

    input.txt 文件内容为:

    菜鸟教程官网地址:www.runoob.com

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");var buf = new Buffer(1024);console.log("准备打开已存在的文件!");fs.open('input.txt', 'r+', function(err, fd) {
       if (err) {
           return console.error(err);
       }
       console.log("文件打开成功!");
       console.log("准备读取文件:");
       fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
          if (err){
             console.log(err);
          }
          console.log(bytes + "  字节被读取");
          
          // 仅输出读取的字节
          if(bytes > 0){
             console.log(buf.slice(0, bytes).toString());
          }
       });});

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备打开已存在的文件!文件打开成功!准备读取文件:42  字节被读取菜鸟教程官网地址:www.runoob.com

    关闭文件

    语法

    以下为异步模式下关闭文件的语法格式:

    fs.close(fd, callback)

    该方法使用了文件描述符来读取文件。

    参数

    参数使用说明如下:

    • fd - 通过 fs.open() 方法返回的文件描述符。

    • callback - 回调函数,没有参数。

    实例

    input.txt 文件内容为:

    菜鸟教程官网地址:www.runoob.com

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");var buf = new Buffer(1024);console.log("准备打开文件!");fs.open('input.txt', 'r+', function(err, fd) {
       if (err) {
           return console.error(err);
       }
       console.log("文件打开成功!");
       console.log("准备读取文件!");
       fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
          if (err){
             console.log(err);
          }
    
          // 仅输出读取的字节
          if(bytes > 0){
             console.log(buf.slice(0, bytes).toString());
          }
    
          // 关闭文件
          fs.close(fd, function(err){
             if (err){
                console.log(err);
             } 
             console.log("文件关闭成功");
          });
       });});

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备打开文件!文件打开成功!准备读取文件!菜鸟教程官网地址:www.runoob.com文件关闭成功

    截取文件

    语法

    以下为异步模式下截取文件的语法格式:

    fs.ftruncate(fd, len, callback)

    该方法使用了文件描述符来读取文件。

    参数

    参数使用说明如下:

    • fd - 通过 fs.open() 方法返回的文件描述符。

    • len - 文件内容截取的长度。

    • callback - 回调函数,没有参数。

    实例

    input.txt 文件内容为:

    site:www.runoob.com

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");var buf = new Buffer(1024);console.log("准备打开文件!");fs.open('input.txt', 'r+', function(err, fd) {
       if (err) {
           return console.error(err);
       }
       console.log("文件打开成功!");
       console.log("截取10字节后的文件内容。");
       
       // 截取文件
       fs.ftruncate(fd, 10, function(err){
          if (err){
             console.log(err);
          } 
          console.log("文件截取成功。");
          console.log("读取相同的文件"); 
          fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
             if (err){
                console.log(err);
             }
    
             // 仅输出读取的字节
             if(bytes > 0){
                console.log(buf.slice(0, bytes).toString());
             }
    
             // 关闭文件
             fs.close(fd, function(err){
                if (err){
                   console.log(err);
                } 
                console.log("文件关闭成功!");
             });
          });
       });});

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备打开文件!文件打开成功!截取10字节后的文件内容。文件截取成功。读取相同的文件site:www.r文件关闭成功

    删除文件

    语法

    以下为删除文件的语法格式:

    fs.unlink(path, callback)

    参数

    参数使用说明如下:

    • path - 文件路径。

    • callback - 回调函数,没有参数。

    实例

    input.txt 文件内容为:

    site:www.runoob.com

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");console.log("准备删除文件!");fs.unlink('input.txt', function(err) {
       if (err) {
           return console.error(err);
       }
       console.log("文件删除成功!");});

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备删除文件!文件删除成功!

    再去查看 input.txt 文件,发现已经不存在了。


    创建目录

    语法

    以下为创建目录的语法格式:

    fs.mkdir(path[, mode], callback)

    参数

    参数使用说明如下:

    • path - 文件路径。

    • mode - 设置目录权限,默认为 0777。

    • callback - 回调函数,没有参数。

    实例

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");console.log(创建目录 /tmp/test");
    fs.mkdir('/tmp/test',function(err){
       if (err) {
           return console.error(err);
       }
       console.log("目录创建成功。");
    });

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  创建目录 /tmp/test目录创建成功。

    读取目录

    语法

    以下为读取目录的语法格式:

    fs.readdir(path, callback)

    参数

    参数使用说明如下:

    • path - 文件路径。

    • callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。

    实例

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");console.log("查看 /tmp 目录");fs.readdir("/tmp/",function(err, files){
       if (err) {
           return console.error(err);
       }
       files.forEach( function (file){
           console.log( file );
       });});

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  查看 /tmp 目录input.outoutput.outtest test.txt

    删除目录

    语法

    以下为删除目录的语法格式:

    fs.rmdir(path, callback)

    参数

    参数使用说明如下:

    • path - 文件路径。

    • callback - 回调函数,没有参数。

    实例

    接下来我们创建 file.js 文件,代码如下所示:

    var fs = require("fs");console.log("准备删除目录 /tmp/test");fs.rmdir("/tmp/test",function(err){
       if (err) {
           return console.error(err);
       }
       console.log("读取 /tmp 目录");
       fs.readdir("/tmp/",function(err, files){
          if (err) {
              return console.error(err);
          }
          files.forEach( function (file){
              console.log( file );
          });
       });});

    以上代码执行结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node file.js  准备删除目录 /tmp/test input.outoutput.outtest test.txt读取 /tmp 目录……

    文件模块方法参考手册

    以下为 Node.js 文件模块相同的方法列表:

    序号方法 & 描述
    1fs.rename(oldPath, newPath, callback)
    异步 rename().回调函数没有参数,但可能抛出异常。
    2fs.ftruncate(fd, len, callback)
    异步 ftruncate().回调函数没有参数,但可能抛出异常。
    3fs.ftruncateSync(fd, len)
    同步 ftruncate()
    4fs.truncate(path, len, callback)
    异步 truncate().回调函数没有参数,但可能抛出异常。
    5fs.truncateSync(path, len)
    同步 truncate()
    6fs.chown(path, uid, gid, callback)
    异步 chown().回调函数没有参数,但可能抛出异常。
    7fs.chownSync(path, uid, gid)
    同步 chown()
    8fs.fchown(fd, uid, gid, callback)
    异步 fchown().回调函数没有参数,但可能抛出异常。
    9fs.fchownSync(fd, uid, gid)
    同步 fchown()
    10fs.lchown(path, uid, gid, callback)
    异步 lchown().回调函数没有参数,但可能抛出异常。
    11fs.lchownSync(path, uid, gid)
    同步 lchown()
    12fs.chmod(path, mode, callback)
    异步 chmod().回调函数没有参数,但可能抛出异常。
    13fs.chmodSync(path, mode)
    同步 chmod().
    14fs.fchmod(fd, mode, callback)
    异步 fchmod().回调函数没有参数,但可能抛出异常。
    15fs.fchmodSync(fd, mode)
    同步 fchmod().
    16fs.lchmod(path, mode, callback)
    异步 lchmod().回调函数没有参数,但可能抛出异常。Only available on Mac OS X.
    17fs.lchmodSync(path, mode)
    同步 lchmod().
    18fs.stat(path, callback)
    异步 stat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。
    19fs.lstat(path, callback)
    异步 lstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。
    20fs.fstat(fd, callback)
    异步 fstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。
    21fs.statSync(path)
    同步 stat(). 返回 fs.Stats 的实例。
    22fs.lstatSync(path)
    同步 lstat(). 返回 fs.Stats 的实例。
    23fs.fstatSync(fd)
    同步 fstat(). 返回 fs.Stats 的实例。
    24fs.link(srcpath, dstpath, callback)
    异步 link().回调函数没有参数,但可能抛出异常。
    25fs.linkSync(srcpath, dstpath)
    同步 link().
    26fs.symlink(srcpath, dstpath[, type], callback)
    异步 symlink().回调函数没有参数,但可能抛出异常。 type 参数可以设置为 'dir', 'file', 或 'junction' (默认为 'file') 。
    27fs.symlinkSync(srcpath, dstpath[, type])
    同步 symlink().
    28fs.readlink(path, callback)
    异步 readlink(). 回调函数有两个参数 err, linkString。
    29fs.realpath(path[, cache], callback)
    异步 realpath(). 回调函数有两个参数 err, resolvedPath。
    30fs.realpathSync(path[, cache])
    同步 realpath()。返回绝对路径。
    31fs.unlink(path, callback)
    异步 unlink().回调函数没有参数,但可能抛出异常。
    32fs.unlinkSync(path)
    同步 unlink().
    33fs.rmdir(path, callback)
    异步 rmdir().回调函数没有参数,但可能抛出异常。
    34fs.rmdirSync(path)
    同步 rmdir().
    35fs.mkdir(path[, mode], callback)
    S异步 mkdir(2).回调函数没有参数,但可能抛出异常。 mode defaults to 0777.
    36fs.mkdirSync(path[, mode])
    同步 mkdir().
    37fs.readdir(path, callback)
    异步 readdir(3). 读取目录的内容。
    38fs.readdirSync(path)
    同步 readdir().返回文件数组列表。
    39fs.close(fd, callback)
    异步 close().回调函数没有参数,但可能抛出异常。
    40fs.closeSync(fd)
    同步 close().
    41fs.open(path, flags[, mode], callback)
    异步打开文件。
    42fs.openSync(path, flags[, mode])
    同步 version of fs.open().
    43fs.utimes(path, atime, mtime, callback)
     
    44fs.utimesSync(path, atime, mtime)
    修改文件时间戳,文件通过指定的文件路径。
    45fs.futimes(fd, atime, mtime, callback)
     
    46fs.futimesSync(fd, atime, mtime)
    修改文件时间戳,通过文件描述符指定。
    47fs.fsync(fd, callback)
    异步 fsync.回调函数没有参数,但可能抛出异常。
    48fs.fsyncSync(fd)
    同步 fsync.
    49fs.write(fd, buffer, offset, length[, position], callback)
    将缓冲区内容写入到通过文件描述符指定的文件。
    50fs.write(fd, data[, position[, encoding]], callback)
    通过文件描述符 fd 写入文件内容。
    51fs.writeSync(fd, buffer, offset, length[, position])
    同步版的 fs.write()。
    52fs.writeSync(fd, data[, position[, encoding]])
    同步版的 fs.write().
    53fs.read(fd, buffer, offset, length, position, callback)
    通过文件描述符 fd 读取文件内容。
    54fs.readSync(fd, buffer, offset, length, position)
    同步版的 fs.read.
    55fs.readFile(filename[, options], callback)
    异步读取文件内容。
    56fs.readFileSync(filename[, options])<br同步版的 fs.readfile.<="" td="">
    57fs.writeFile(filename, data[, options], callback)
    异步写入文件内容。
    58fs.writeFileSync(filename, data[, options])
    同步版的 fs.writeFile。
    59fs.appendFile(filename, data[, options], callback)
    异步追加文件内容。
    60fs.appendFileSync(filename, data[, options])
    The 同步 version of fs.appendFile.
    61fs.watchFile(filename[, options], listener)
    查看文件的修改。
    62fs.unwatchFile(filename[, listener])
    停止查看 filename 的修改。
    63fs.watch(filename[, options][, listener])
    查看 filename 的修改,filename 可以是文件或目录。返回 fs.FSWatcher 对象。
    64fs.exists(path, callback)
    检测给定的路径是否存在。
    65fs.existsSync(path)
    同步版的 fs.exists.
    66fs.access(path[, mode], callback)
    测试指定路径用户权限。
    67fs.accessSync(path[, mode])
    同步版的 fs.access。
    68fs.createReadStream(path[, options])
    返回ReadStream 对象。
    69fs.createWriteStream(path[, options])
    返回 WriteStream 对象。
    70fs.symlink(srcpath, dstpath[, type], callback)
    异步 symlink().回调函数没有参数,但可能抛出异常。


    ,220)/}

    系统,文件,
    2015-11-24

    123

  • Node.js GET/POST请求
    Node.js GET/POST请求

    2015-11-24

    103

  • Node.js 工具模块
    Node.js 工具模块

    2015-11-24

    85

  • Node.js Web 模块
    Node.js Web 模块

    接着我们在浏览器中打开地址:http://127.0.0.1:8081/index.htm,显示如下图所示:

    执行 server.js 的控制台输出信息如下:

    Server running at http://127.0.0.1:8081/Request for /index.htm received.     #  客户端请求信息

    Gif 实例演示


    使用 Node 创建 Web 客户端

    Node 创建 Web 客户端需要引入 http 模块,创建 client.js 文件,代码如下所示:

    <pre>var http = require('http');
    
    // 用于请求的选项
    var options = {
       host: 'localhost',
       port: '8081',
       path: '/index.htm'  
    };
    
    // 处理响应的回调函数
    var callback = function(response){
       // 不断更新数据
       var body = '';
       response.on('data', function(data) {
          body += data;
       });
       
       response.on('end', function() {
          // 数据接收完成
          console.log(body);
       });
    }
    // 向服务端发送请求
    var req = http.request(options, callback);
    req.end();

    新开一个终端,执行 client.js 文件,输出结果如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node client.js<html><head><title>Sample Page</title></head><body>Hello World!</body></html>

    执行 server.js 的控制台输出信息如下:

    Server running at http://127.0.0.1:8081/Request for /index.htm received.   # 客户端请求信息

    Gif 实例演示


    ,220)/}

    模块,
    2015-11-24

    139

  • Node.js Express 框架
    Node.js Express 框架

    以上命令会将 Express 框架安装在当期目录的 node_modules 目录中, node_modules 目录下会自动创建 express 目录。以下几个重要的模块是需要与 express 框架一起安装的:

    • body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。

    • cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。

    • multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm install body-parser --save

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm install cookie-parser --save

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm install multer --save

    第一个 Express 框架实例

    接下来我们使用 Express 框架来输出 "Hello World"。

    以下实例中我们引入了 express 模块,并在客户端发起请求后,响应 "Hello World" 字符串。

    创建 express_demo.js 文件,代码如下所示:

    //express_demo.js 文件var express = require('express');var app = express();app.get('/', function (req, res) {
       res.send('Hello World');})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    执行以上代码:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node express_demo.js  应用实例,访问地址为 http://0.0.0.0:8081

    在浏览器中访问 http://127.0.0.1:8081,结果如下图所示:


    请求和响应

    Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据。

    app.get('/', function (req, res) {
       // --})

    可以通过以下链接查看 request 和 response 对象的具体介绍:

    Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

    1. req.app:当callback为外部文件时,用req.app访问express的实例

    2. req.baseUrl:获取路由当前安装的URL路径

    3. req.body / req.cookies:获得「请求主体」/ Cookies

    4. req.fresh / req.stale:判断请求是否还「新鲜」

    5. req.hostname / req.ip:获取主机名和IP地址

    6. req.originalUrl:获取原始请求URL

    7. req.params:获取路由的parameters

    8. req.path:获取请求路径

    9. req.protocol:获取协议类型

    10. req.query:获取URL的查询参数串

    11. req.route:获取当前匹配的路由

    12. req.subdomains:获取子域名

    13. req.accpets():检查请求的Accept头的请求类型

    14. req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages

    15. req.get():获取指定的HTTP请求头

    16. req.is():判断请求头Content-Type的MIME类型

    Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

    1. res.app:同req.app一样

    2. res.append():追加指定HTTP头

    3. res.set()在res.append()后将重置之前设置的头

    4. res.cookie(name,value [,option]):设置Cookie

    5. opition: domain / expires / httpOnly / maxAge / path / secure / signed

    6. res.clearCookie():清除Cookie

    7. res.download():传送指定路径的文件

    8. res.get():返回指定的HTTP头

    9. res.json():传送JSON响应

    10. res.jsonp():传送JSONP响应

    11. res.location():只设置响应的Location HTTP头,不设置状态码或者close response

    12. res.redirect():设置响应的Location HTTP头,并且设置状态码302

    13. res.send():传送HTTP响应

    14. res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type

    15. res.set():设置HTTP头,传入object可以一次设置多个头

    16. res.status():设置HTTP状态码

    17. res.type():设置Content-Type的MIME类型


    路由

    我们已经了解了 HTTP 请求的基本应用,而路由决定了由谁(指定脚本)去响应客户端请求。

    在HTTP请求中,我们可以通过路由提取出请求的URL以及GET/POST参数。

    接下来我们扩展 Hello World,添加一些功能来处理更多类型的 HTTP 请求。

    创建 express_demo2.js 文件,代码如下所示:

    var express = require('express');var app = express();//  主页输出 "Hello World"app.get('/', function (req, res) {
       console.log("主页 GET 请求");
       res.send('Hello GET');})//  POST 请求app.post('/', function (req, res) {
       console.log("主页 POST 请求");
       res.send('Hello POST');})//  /del_user 页面响应app.delete('/del_user', function (req, res) {
       console.log("/del_user 响应 DELETE 请求");
       res.send('删除页面');})//  /list_user 页面 GET 请求app.get('/list_user', function (req, res) {
       console.log("/list_user GET 请求");
       res.send('用户列表页面');})// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求app.get('/ab*cd', function(req, res) {   
       console.log("/ab*cd GET 请求");
       res.send('正则匹配');})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    执行以上代码:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node express_demo2.js  应用实例,访问地址为 http://0.0.0.0:8081

    接下来你可以尝试访问 http://127.0.0.1:8081 不同的地址,查看效果。

    在浏览器中访问 http://127.0.0.1:8081/list_user,结果如下图所示:

    在浏览器中访问 http://127.0.0.1:8081/abcd,结果如下图所示:

    在浏览器中访问 http://127.0.0.1:8081/abcdefg,结果如下图所示:


    静态文件

    Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。

    你可以使用 express.static 中间件来设置静态文件路径。例如,如果你将图片, CSS, JavaScript 文件放在 public 目录下,你可以这么写:

    app.use(express.static('public'));

    我们可以到 public/images 目录下放些图片,如下所示:

    node_modules
    server.jspublic/public/imagespublic/images/logo.png

    让我们再修改下 "Hello Word" 应用添加处理静态文件的功能。

    创建 express_demo3.js 文件,代码如下所示:

    var express = require('express');var app = express();app.use(express.static('public'));app.get('/', function (req, res) {
       res.send('Hello World');})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    执行以上代码:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node express_demo3.js  应用实例,访问地址为 http://0.0.0.0:8081

    执行以上代码:

    在浏览器中访问 http://127.0.0.1:8081/images/logo.png(本实例采用了菜鸟教程的logo),结果如下图所示:


    GET 方法

    以下实例演示了在表单中通过 GET 方法提交两个参数,我们可以使用 server.js 文件内的 process_get 路由器来处理输入:

    index.htm 文件代码如下:

    <html><body><form action="http://127.0.0.1:8081/process_get" method="GET">First Name: <input type="text" name="first_name">  <br>Last Name: <input type="text" name="last_name"><input type="submit" value="Submit"></form></body></html>

    server.js 文件代码如下:

    var express = require('express');var app = express();app.use(express.static('public'));app.get('/index.htm', function (req, res) {
       res.sendFile( __dirname + "/" + "index.htm" );})app.get('/process_get', function (req, res) {
    
       // 输出 JSON 格式
       response = {
           first_name:req.query.first_name,
           last_name:req.query.last_name   };
       console.log(response);
       res.end(JSON.stringify(response));})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    执行以上代码:

    node server.js 
    应用实例,访问地址为 http://0.0.0.0:8081

    浏览器访问 http://127.0.0.1:8081/index.htm,如图所示:

    现在你可以向表单输入数据,并提交,如下演示:


    POST 方法

    以下实例演示了在表单中通过 POST 方法提交两个参数,我们可以使用 server.js 文件内的 process_get 路由器来处理输入:

    index.htm 文件代码修改如下:

    <html><body><form action="http://127.0.0.1:8081/process_post" method="POST">First Name: <input type="text" name="first_name">  <br>Last Name: <input type="text" name="last_name"><input type="submit" value="Submit"></form></body></html>

    server.js 文件代码修改如下:

    var express = require('express');var app = express();var bodyParser = require('body-parser');// 创建 application/x-www-form-urlencoded 编码解析var urlencodedParser = bodyParser.urlencoded({ extended: false })app.use(express.static('public'));app.get('/index.htm', function (req, res) {
       res.sendFile( __dirname + "/" + "index.htm" );})app.post('/process_post', urlencodedParser, function (req, res) {
    
       // 输出 JSON 格式
       response = {
           first_name:req.body.first_name,
           last_name:req.body.last_name   };
       console.log(response);
       res.end(JSON.stringify(response));})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    执行以上代码:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node express_demo.js  应用实例,访问地址为 http://0.0.0.0:8081

    浏览器访问 http://127.0.0.1:8081/index.htm,如图所示:

    现在你可以向表单输入数据,并提交,如下演示:


    文件上传

    以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 enctype 属性设置为 multipart/form-data。

    index.htm 文件代码修改如下:

    <html><head><title>文件上传表单</title></head><body><h3>文件上传:</h3>选择一个文件上传: <br /><form action="/file_upload" method="post" enctype="multipart/form-data"><input type="file" name="image" size="50" /><br /><input type="submit" value="上传文件" /></form></body></html>

    server.js 文件代码修改如下:

    var express = require('express');var app = express();var fs = require("fs");var bodyParser = require('body-parser');var multer  = require('multer');app.use(express.static('public'));app.use(bodyParser.urlencoded({ extended: false }));app.use(multer({ dest: '/tmp/'}).array('image'));app.get('/index.htm', function (req, res) {
       res.sendFile( __dirname + "/" + "index.htm" );})app.post('/file_upload', function (req, res) {
    
       console.log(req.files[0]);  // 上传的文件信息
    
       var des_file = __dirname + "/" + req.files[0].originalname;
       fs.readFile( req.files[0].path, function (err, data) {
            fs.writeFile(des_file, data, function (err) {
             if( err ){
                  console.log( err );
             }else{
                   response = {
                       message:'File uploaded successfully', 
                       filename:req.files[0].originalname              };
              }
              console.log( response );
              res.end( JSON.stringify( response ) );
           });
       });})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
    
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    执行以上代码:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node express_demo.js  应用实例,访问地址为 http://0.0.0.0:8081

    浏览器访问 http://127.0.0.1:8081/index.htm,如图所示:

    现在你可以向表单输入数据,并提交,如下演示:


    Cookie 管理

    我们可以使用中间件向 Node.js 服务器发送 cookie 信息,以下代码输出了客户端发送的 cookie 信息:

    // express_cookie.js 文件var express      = require('express')var cookieParser = require('cookie-parser')var app = express()app.use(cookieParser())app.get('/', function(req, res) {
      console.log("Cookies: ", req.cookies)})app.listen(8081)

    执行以上代码:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node express_demo.js


    ,220)/}

    框架,
    2015-11-24

    125

  • Node.js RESTful API
    Node.js RESTful API

    在浏览器中访问 http://127.0.0.1:8081/listUsers,结果如下所示:

    {
       "user1" : {
          "name" : "mahesh",
          "password" : "password1",
          "profession" : "teacher",
          "id": 1
       },
       "user2" : {
          "name" : "suresh",
          "password" : "password2",
          "profession" : "librarian",
          "id": 2
       },
       "user3" : {
          "name" : "ramesh",
          "password" : "password3",
          "profession" : "clerk",
          "id": 3
       }}

    添加用户

    以下代码,我们创建了 RESTful API addUser, 用于添加新的用户数据,server.js 文件代码如下所示:

    var express = require('express');var app = express();var fs = require("fs");//添加的新用户数据var user = {
       "user4" : {
          "name" : "mohit",
          "password" : "password4",
          "profession" : "teacher",
          "id": 4
       }}app.get('/addUser', function (req, res) {
       // 读取已存在的数据
       fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
           data = JSON.parse( data );
           data["user4"] = user["user4"];
           console.log( data );
           res.end( JSON.stringify(data));
       });})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    接下来执行以下命令:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node server.js  应用实例,访问地址为 http://0.0.0.0:8081

    在浏览器中访问 http://127.0.0.1:8081/addUsers,结果如下所示:

    { user1:
       { name: 'mahesh',
         password: 'password1',
         profession: 'teacher',
         id: 1 },
      user2:
       { name: 'suresh',
         password: 'password2',
         profession: 'librarian',
         id: 2 },
      user3:
       { name: 'ramesh',
         password: 'password3',
         profession: 'clerk',
         id: 3 },
      user4:
       { name: 'mohit',
         password: 'password4',
         profession: 'teacher',
         id: 4 } }

    显示用户详情

    以下代码,我们创建了 RESTful API :id(用户id), 用于读取指定用户的详细信息,server.js 文件代码如下所示:

    var express = require('express');var app = express();var fs = require("fs");app.get('/:id', function (req, res) {
       // 首先我们读取已存在的用户
       fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
           data = JSON.parse( data );
           var user = data["user" + req.params.id] 
           console.log( user );
           res.end( JSON.stringify(user));
       });})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    接下来执行以下命令:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node server.js  应用实例,访问地址为 http://0.0.0.0:8081

    在浏览器中访问 http://127.0.0.1:8081/2,结果如下所示:

    {
       "name":"suresh",
       "password":"password2",
       "profession":"librarian",
       "id":2}

    删除用户

    以下代码,我们创建了 RESTful API deleteUser, 用于删除指定用户的详细信息,以下实例中,用户 id 为 2,server.js 文件代码如下所示:

    var express = require('express');var app = express();var fs = require("fs");var id = 2;app.get('/deleteUser', function (req, res) {
    
       // First read existing users.
       fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
           data = JSON.parse( data );
           delete data["user" + 2];
           
           console.log( data );
           res.end( JSON.stringify(data));
       });})var server = app.listen(8081, function () {
    
      var host = server.address().address  var port = server.address().port
      console.log("应用实例,访问地址为 http://%s:%s", host, port)})

    接下来执行以下命令:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node server.js  应用实例,访问地址为 http://0.0.0.0:8081

    在浏览器中访问 http://127.0.0.1:8081/deleteUser,结果如下所示:

    { user1:
       { name: 'mahesh',
         password: 'password1',
         profession: 'teacher',
         id: 1 },
      user3:
       { name: 'ramesh',
         password: 'password3',
         profession: 'clerk',
         id: 3 } }


    ,220)/}

    API,
    2015-11-24

    126

  • Node.js 多进程
    Node.js 多进程

    spawn() 方法

    child_process.spawn 使用指定的命令行参数创建新线程,语法格式如下:

    child_process.spawn(command[, args][, options])

    参数

    参数说明如下:

    command: 将要运行的命令

    args: Array 字符串参数数组

    options Object

    • cwd String 子进程的当前工作目录

    • env Object 环境变量键值对

    • stdio Array|String 子进程的 stdio 配置

    • detached Boolean 这个子进程将会变成进程组的领导

    • uid Number 设置用户进程的 ID

    • gid Number 设置进程组的 ID

    spawn() 方法返回流 (stdout & stderr),在进程返回大量数据时使用。进程一旦开始执行时 spawn() 就开始接收响应。

    实例

    让我们创建两个 js 文件 support.js 和 master.js。

    support.js 文件代码:

    console.log("进程 " + process.argv[2] + " 执行。" );

    master.js 文件代码:

    const fs = require('fs');const child_process = require('child_process');
     for(var i=0; i<3; i++) {
       var workerProcess = child_process.spawn('node', ['support.js', i]);
    
       workerProcess.stdout.on('data', function (data) {
          console.log('stdout: ' + data);
       });
    
       workerProcess.stderr.on('data', function (data) {
          console.log('stderr: ' + data);
       });
    
       workerProcess.on('close', function (code) {
          console.log('子进程已退出,退出码 '+code);
       });}

    执行以上代码,输出结果为:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node master.js stdout: 进程 0 执行。子进程已退出,退出码 0stdout: 进程 1 执行。子进程已退出,退出码 0stdout: 进程 2 执行。子进程已退出,退出码 0

    fork 方法

    child_process.fork 是 spawn() 方法的特殊形式,用于创建进程,语法格式如下:

    child_process.fork(modulePath[, args][, options])

    参数

    参数说明如下:

    modulePath: String,将要在子进程中运行的模块

    args: Array 字符串参数数组

    options:Object

    • cwd String 子进程的当前工作目录

    • env Object 环境变量键值对

    • execPath String 创建子进程的可执行文件

    • execArgv Array 子进程的可执行文件的字符串参数数组(默认: process.execArgv)

    • silent Boolean 如果为true,子进程的stdinstdoutstderr将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false

    • uid Number 设置用户进程的 ID

    • gid Number 设置进程组的 ID

    返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。

    h3>实例

    让我们创建两个 js 文件 support.js 和 master.js。

    support.js 文件代码:

    console.log("进程 " + process.argv[2] + " 执行。" );

    master.js 文件代码:

    const fs = require('fs');const child_process = require('child_process');
     for(var i=0; i<3; i++) {
       var worker_process = child_process.fork("support.js", [i]);	
    
       worker_process.on('close', function (code) {
          console.log('子进程已退出,退出码 ' + code);
       });}

    执行以上代码,输出结果为:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node master.js  进程 0 执行。子进程已退出,退出码 0进程 1 执行。子进程已退出,退出码 0进程 2 执行。子进程已退出,退出码 0


    ,220)/}

    进程,
    2015-11-24

    133

  • Node.js JXcore 打包
    Node.js JXcore 打包

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;unzip jx_rh64.zip

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;cp jx_rh64/jx /usr/bin

    将 /usr/bin 添加到 PATH 路径中:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;export PATH=$PATH:/usr/bin

    以上步骤如果操作正确,使用以下命令,会输出版本号信息:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;jx --version v0.10.32

    包代码

    例如,我们的 Node.js 项目包含以下几个文件,其中 index.js 是主文件:

    drwxr-xr-x  2 root root  4096 Nov 13 12:42 images
    -rwxr-xr-x  1 root root 30457 Mar  6 12:19 index.htm
    -rwxr-xr-x  1 root root 30452 Mar  1 12:54 index.js
    drwxr-xr-x 23 root root  4096 Jan 15 03:48 node_modules
    drwxr-xr-x  2 root root  4096 Mar 21 06:10 scripts
    drwxr-xr-x  2 root root  4096 Feb 15 11:56 style

    接下来我们使用 jx 命令打包以上项目,并指定 index.js 为 Node.js 项目的主文件:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;jx package index.js index


    以上命令执行成功,会生成以下两个文件:

    • index.jxp 这是一个中间件文件,包含了需要编译的完整项目信息。

    • index.jx 这是一个完整包信息的二进制文件,可运行在客户端上。


    载入 JX 文件

    我们使用 jx 命令打包项目:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;node index.js command_line_arguments

    使用 JXcore 编译后,我们可以使用以下命令来执行生成的 jx 二进制文件:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;jx index.jx command_line_arguments


    ,220)/}

    打包,
    2015-11-24

    422

  • NPM 使用介绍
    NPM 使用介绍

    [ERR:(RemoveHtmlTag)标签缺少参数]nbsp;npm -v2.3.0

    如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;sudo npm install npm -g/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js npm@2.14.2 /usr/local/lib/node_modules/npm

    使用 npm 命令安装模块

    npm 安装 Node.js 模块语法格式如下:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm install <Module Name>

    以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm install express

    安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。

    var express = require('express');

    全局安装与本地安装

    npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如

    npm install express          # 本地安装npm install express -g   # 全局安装

    如果出现以下错误:

    npm err! Error: connect ECONNREFUSED 127.0.0.1:8087

    解决办法为:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm config set proxy null

    本地安装

    • 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。

    • 2. 可以通过 require() 来引入本地安装的包。

    全局安装

    • 1. 将安装包放在 /usr/local 下。

    • 2. 可以直接在命令行里使用。

    • 3. 不能通过 require() 来引入本地安装的包。

    接下来我们使用全局方式安装 express

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm install express -g

    安装过程输出如下内容,第一行输出了模块的版本号及安装位置。

    express@4.13.3 node_modules/express├── escape-html@1.0.2├── range-parser@1.0.2├── merge-descriptors@1.0.0├── array-flatten@1.1.1├── cookie@0.1.3├── utils-merge@1.0.0├── parseurl@1.3.0├── cookie-signature@1.0.6├── methods@1.1.1├── fresh@0.3.0├── vary@1.0.1├── path-to-regexp@0.1.7├── content-type@1.0.1├── etag@1.7.0├── serve-static@1.10.0├── content-disposition@0.5.0├── depd@1.0.1├── qs@4.0.0├── finalhandler@0.4.0 (unpipe@1.0.0)├── on-finished@2.3.0 (ee-first@1.1.1)├── proxy-addr@1.0.8 (forwarded@0.1.0, ipaddr.js@1.0.1)├── debug@2.2.0 (ms@0.7.1)├── type-is@1.6.8 (media-typer@0.3.0, mime-types@2.1.6)├── accepts@1.2.12 (negotiator@0.5.3, mime-types@2.1.6)└── send@0.13.0 (destroy@1.0.3, statuses@1.2.1, ms@0.7.1, mime@1.3.4, http-errors@1.3.1)

    你可以使用以下命令来查看所有全局安装的模块:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm ls -g

    使用 package.json

    package.json 位于模块的目录下,用于定义包的属性。接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:

    {
      "name": "express",
      "description": "Fast, unopinionated, minimalist web framework",
      "version": "4.13.3",
      "author": {
        "name": "TJ Holowaychuk",
        "email": "tj@vision-media.ca"
      },
      "contributors": [
        {
          "name": "Aaron Heckmann",
          "email": "aaron.heckmann+github@gmail.com"
        },
        {
          "name": "Ciaran Jessup",
          "email": "ciaranj@gmail.com"
        },
        {
          "name": "Douglas Christopher Wilson",
          "email": "doug@somethingdoug.com"
        },
        {
          "name": "Guillermo Rauch",
          "email": "rauchg@gmail.com"
        },
        {
          "name": "Jonathan Ong",
          "email": "me@jongleberry.com"
        },
        {
          "name": "Roman Shtylman",
          "email": "shtylman+expressjs@gmail.com"
        },
        {
          "name": "Young Jae Sim",
          "email": "hanul@hanul.me"
        }
      ],
      "license": "MIT",
      "repository": {
        "type": "git",
        "url": "git+https://github.com/strongloop/express.git"
      },
      "homepage": "http://expressjs.com/",
      "keywords": [
        "express",
        "framework",
        "sinatra",
        "web",
        "rest",
        "restful",
        "router",
        "app",
        "api"
      ],
      "dependencies": {
        "accepts": "~1.2.12",
        "array-flatten": "1.1.1",
        "content-disposition": "0.5.0",
        "content-type": "~1.0.1",
        "cookie": "0.1.3",
        "cookie-signature": "1.0.6",
        "debug": "~2.2.0",
        "depd": "~1.0.1",
        "escape-html": "1.0.2",
        "etag": "~1.7.0",
        "finalhandler": "0.4.0",
        "fresh": "0.3.0",
        "merge-descriptors": "1.0.0",
        "methods": "~1.1.1",
        "on-finished": "~2.3.0",
        "parseurl": "~1.3.0",
        "path-to-regexp": "0.1.7",
        "proxy-addr": "~1.0.8",
        "qs": "4.0.0",
        "range-parser": "~1.0.2",
        "send": "0.13.0",
        "serve-static": "~1.10.0",
        "type-is": "~1.6.6",
        "utils-merge": "1.0.0",
        "vary": "~1.0.1"
      },
      "devDependencies": {
        "after": "0.8.1",
        "ejs": "2.3.3",
        "istanbul": "0.3.17",
        "marked": "0.3.5",
        "mocha": "2.2.5",
        "should": "7.0.2",
        "supertest": "1.0.1",
        "body-parser": "~1.13.3",
        "connect-redis": "~2.4.1",
        "cookie-parser": "~1.3.5",
        "cookie-session": "~1.2.0",
        "express-session": "~1.11.3",
        "jade": "~1.11.0",
        "method-override": "~2.3.5",
        "morgan": "~1.6.1",
        "multiparty": "~4.1.2",
        "vhost": "~3.0.1"
      },
      "engines": {
        "node": ">= 0.10.0"
      },
      "files": [
        "LICENSE",
        "History.md",
        "Readme.md",
        "index.js",
        "lib/"
      ],
      "scripts": {
        "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
        "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/",
        "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
        "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"
      },
      "gitHead": "ef7ad681b245fba023843ce94f6bcb8e275bbb8e",
      "bugs": {
        "url": "https://github.com/strongloop/express/issues"
      },
      "_id": "express@4.13.3",
      "_shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
      "_from": "express@*",
      "_npmVersion": "1.4.28",
      "_npmUser": {
        "name": "dougwilson",
        "email": "doug@somethingdoug.com"
      },
      "maintainers": [
        {
          "name": "tjholowaychuk",
          "email": "tj@vision-media.ca"
        },
        {
          "name": "jongleberry",
          "email": "jonathanrichardong@gmail.com"
        },
        {
          "name": "dougwilson",
          "email": "doug@somethingdoug.com"
        },
        {
          "name": "rfeng",
          "email": "enjoyjava@gmail.com"
        },
        {
          "name": "aredridel",
          "email": "aredridel@dinhe.net"
        },
        {
          "name": "strongloop",
          "email": "callback@strongloop.com"
        },
        {
          "name": "defunctzombie",
          "email": "shtylman@gmail.com"
        }
      ],
      "dist": {
        "shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
        "tarball": "http://registry.npmjs.org/express/-/express-4.13.3.tgz"
      },
      "directories": {},
      "_resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz",
      "readme": "ERROR: No README data found!"}

    Package.json 属性说明

    • name - 包名。

    • version - 包的版本号。

    • description - 包的描述。

    • homepage - 包的官网 url 。

    • author - 包的作者姓名。

    • contributors - 包的其他贡献者姓名。

    • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。

    • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。

    • main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。

    • keywords - 关键字


    卸载模块

    我们可以使用以下命令来卸载 Node.js 模块。

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm uninstall express


    卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm ls

    更新模块

    我们可以使用以下命令更新模块:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm update express

    搜索模块

    使用以下来搜索模块:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm search express

    创建模块

    创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。

    This utility will walk you through creating a package.json file.It only covers the most common items, and tries to guess sensible defaults.See `npm help json` for definitive documentation on these fieldsand exactly what they do.Use `npm install <pkg> --save` afterwards to install a package andsave it as a dependency in the package.json file.Press ^C at any time to quit.name: (node_modules) runoob                   # 模块名version: (1.0.0) description: Node.js 测试模块(www.runoob.com)  # 描述entry point: (index.js) test command: make test
    git repository: https://github.com/runoob/runoob.git  # Github 地址keywords: author: license: (ISC) About to write to ……/node_modules/package.json:      # 生成地址{
      "name": "runoob",
      "version": "1.0.0",
      "description": "Node.js 测试模块(www.runoob.com)",
      ……}Is this ok? (yes) yes

    以上的信息,你需要根据你自己的情况输入。在最后输入 "yes" 后会生成 package.json 文件。

    接下来我们可以使用以下命令在 npm 资源库中注册用户(使用邮箱注册):

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm adduserUsername: mcmohdPassword:Email: (this IS public) mcmohd@gmail.com

    接下来我们就用以下命令来发布模块:

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

    Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

    Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.


    事件驱动程序

    Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

    当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

    这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

    在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。


    整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

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

    以下程序绑定事件处理程序:

    // 绑定事件及事件的处理程序
    eventEmitter.on('eventName', eventHandler);

    我们可以通过程序触发事件:

    // 触发事件
    eventEmitter.emit('eventName');

    实例

    创建 main.js 文件,代码如下所示:


    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 创建事件处理程序
    var connectHandler = function connected() {
       console.log('连接成功。');
      
       // 触发 data_received 事件 
       eventEmitter.emit('data_received');
    }
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', connectHandler);
     
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', function(){
       console.log('数据接收成功。');
    });
    
    // 触发 connection 事件 
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");

    接下来让我们执行以上代码:

    $ node main.js
    连接成功。
    数据接收成功。
    程序执行完毕。

    Node 应用程序是如何工作的?

    在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。

    接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下:

    菜鸟教程官网地址:www.runoob.com

    创建 main.js 文件,代码如下:

    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
       if (err){
          console.log(err.stack);
          return;
       }
       console.log(data.toString());
    });
    console.log("程序执行完毕");

    以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。

    如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

    执行以上代码,执行结果如下:

    程序执行完毕
    菜鸟教程官网地址:www.runoob.com

    接下来我们删除 input.txt 文件,执行结果如下所示:

    程序执行完毕
    Error: ENOENT, open 'input.txt'

    因为文件 input.txt 不存在,所以输出了错误信息。


    nbsp;npm publish

    如果你以上的步骤都操作正确,你就可以跟其他模块一样使用 npm 来安装。


    版本号

    使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。

    语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

    • 如果只是修复bug,需要更新Z位。

    • 如果是新增了功能,但是向下兼容,需要更新Y位。

    • 如果有大变动,向下不兼容,需要更新X位。

    版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。

    NPM支持的所有版本号范围指定方式可以查看官方文档。


    NPM 常用命令

    除了本章介绍的部分外,NPM还提供了很多功能,package.json里也有很多其它有用的字段。

    除了可以在npmjs.org/doc/查看官方文档外,这里再介绍一些NPM常用命令。

    NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

    • NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

    • 使用npm help <command>可查看某条命令的详细帮助,例如npm help install。

    • 在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

    • 使用npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

    • 使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。

    • 使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

    • 使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。


    ,220)/}

    使用,介绍,
    2015-11-24

    101

  • Node.js 安装配置
    Node.js 安装配置

    2015-11-24

    122