第三節(jié) Node模塊-Events, Util

EventEmitter 類

Node.js 所有的異步 I/O 操作在完成時都會發(fā)送一個事件到事件隊列。Node.js里面的許多對象都會分發(fā)事件:一個net.Server對象會在每次有新連接時分發(fā)一個事件, 一個fs.readStream對象會在文件被打開的時候發(fā)出一個事件。 所有這些產生事件的對象都是 events.EventEmitter 的實例。

events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發(fā)與事件監(jiān)聽器功能的封裝。

你可以通過require(“events”);來訪問該模塊。

// 引入 events 模塊var events = require('events');//?

創(chuàng)建 eventEmitter 對象var eventEmitter = new events.EventEmitter();

其中 emitter 為事件的主體,比如這個例子中是一只狗, 它是對事件的響應者。

在nodejs中,每個 emitter 都是 events.EventEmitter 類(姑且稱為類吧,雖然JS里沒類)的一個實例。

var events=require(“events”);

var dog=new events.EventEmitter();

和普通的 Object 相比, events.EventEmitter 具有 addListener(或者寫成on) , 和 emit 方法。

function bark()

{console.log(“wang wang!!!”);}dog.addListener(“RingRing”,bark);?

// 為狗狗添加一個條件反射,只要一聽到 “RingRing” 的鈴鐺響,就執(zhí)行 bark;dog.emit(“RingRing”); //聽到 “RingRing”

EventEmitter 方法

addListener(event, listener)

為指定事件添加一個監(jiān)聽器到監(jiān)聽器數組的尾部。

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 參數');

once(event, listener)

server.once('connection', function (stream) { console.log('Ah, we have our first user!');})

removeListener(event, listener)

var callback = function(stream) { console.log('someone connected!');};server.on('connection', callback);// ...server.removeListener('connection', callback);

自定義事件觸發(fā)

emit(event, [arg1], [arg2], […])

error 事件

當 error 被觸發(fā)時,EventEmitter 規(guī)定如果沒有響 應的監(jiān)聽器,Node.js 會把它當作異常,退出程序并輸出錯誤信息。

var events = require('events');

var emitter = new events.EventEmitter();

emitter.emit('error');

uitil模塊

util 是一個Node.js 核心模塊,提供常用函數的集合,用于彌補核心JavaScript 的功能 過于精簡的不足

util.inherits

util.inherits(constructor, superConstructor)是一個實現對象間原型繼承 的函數。

**注意:Sub 僅僅繼承了Base 在原型中定義的函數,而構造函數內部創(chuàng)造的 base 屬 性和 sayHello 函數都沒有被 Sub 繼承。

util.inspect

util.inspect(object,[showHidden],[depth],[colors])是一個將任意對象轉換 為字符串的方法,通常用于調試和錯誤輸出。它至少接受一個參數 object,即要轉換的對象。

var util = require('util');

?function Person() { this.name = 'byvoid';

?this.toString = function() { return this.name; }; }?

var obj = new Person();

?console.log(util.inspect(obj));?

console.log(util.inspect(obj, true));

util.format()

第一個參數是一個包含數字或者是更多其他占位符的字符串。每個占位符都將用相應參數替換。支持的占位符有以下幾種:


%s - String.

?

%d - Number (包含 integer 和 float).

?

%j - JSON.

?

%% - 一個百分號('%'). 這不消耗參數.

如果占位符沒有相應的參數,這個占位符將不會被替換。

?

util.format('%s:%s', 'foo'); // 'foo:%s'

util.isArray(object)

如果給定的參數 “object” 是一個數組返回true,否則返回false。

如果給定的參數 “object” 是一個數組返回true,否則返回false。

process對象

process對象用于處理與當前進程相關的事情,它是一個全局對象,可以在任何地方直接訪問到它而無需引入額外模塊。 它是 EventEmitter 的一個實例。


const memUsage = process.memoryUsage();//內存使用const cpuUsage = process.cpuUsage();//cpu使用

const cfg = process.config;//編譯node.js的配置信息

const env = process.env;//用戶環(huán)境

?const pwd = process.cwd();//工作目錄

const execPath = process.execPath;//node.exe目

const pf = process.platform;//

運行nodejs的操作系統平臺

const release = process.release;//nodejs

發(fā)行版本

const pid = process.pid;//nodejs

進程號

const arch = process.arch;//運行nodejs的操作系統架構const uptime = process.uptime();//nodejs進程運行時間

process.exit():退出當前進程。

process.chdir()改變工作目錄的例子。

(1)exit事件

當前進程退出時,會觸發(fā)exit事件,可以對該事件指定回調函數。這一個用來定時檢查模塊的狀態(tài)的好鉤子(hook)(例如單元測試),當主事件循環(huán)在執(zhí)行完’exit’的回調函數后將不再執(zhí)行,所以在exit事件中定義的定時器可能不會被加入事件列表.

process.on('exit', function () {

? fs.writeFileSync('/tmp/myfile', 'This MUST be saved on exit.');

});

(2)uncaughtException事件

當前進程拋出一個沒有被捕捉的意外時,會觸發(fā)uncaughtException事件。

加密

首先介紹哈希算法的使用,使用crypto.createHash()方法可以得到哈希的實例,他提供的算法實現包括:md5,sha1,sha256,sha512,ripemd160。在下面的例子中,我們使用hash.update()加密字符串,使用hash.digest()輸出字符串。

var crypto = require('crypto');var md5 = crypto.createHash('md5');md5.update('foo');md5.digest();

上面輸出的結果有點怪異,是因為他是以2進制的形式展現的,通常我們需要使用16進制展現數據。給hash.digest()加個參數:hex。

var crypto = require('crypto');var md5 = crypto.createHash('md5');md5.update('foo');md5.digest();md5.digest('hex');

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容