createServer創建第一個Node.js程序
http模塊的createServer函數實際調用V8引擎的C++庫,對指定端口進行監聽(socket)。當端口有連接訪問時進行處理。
使用createServer函數搭建Node.js服務:
var http = require('http');//引用http模塊
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8080);//端口號
在瀏覽器中輸入127.0.0.1:8080即可查看到Hello World。
此外, 代碼中require用來引用模塊。除了引用Node.js基礎API模塊,我們也可以自己定義模塊並引用。具體,看後文Node.js的模塊。
EventEmitter(事件分發)
Node.js 所有的異步 I/O 操作在完成時都會發送一個事件到事件隊列。Node.js 裏面的許多對象都會分發事件。
Node.js的events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發與事件監聽器功能的封裝。
EventEmitter 對象如果在實例化時發生錯誤,會觸發 error 事件。當添加新的監聽器時,newListener 事件會觸發,當監聽器被移除時,removeListener 事件被觸發。
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('event_name', function() {
console.log('event_name事件觸發');
});
setTimeout(function() {
event.emit('event_name');
}, 1000);
執行結果:1s後輸出“event_name事件觸發”。
同一個事件對象可以添加多個監聽者:
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 參數');
執行結果:
listener1 arg1 參數 arg2 參數
listener2 arg1 參數 arg2 參數
EventEmitter常用函數:
序號 |
方法 & 描述 |
1 |
addListener(event, listener) 爲指定事件添加一個監聽器到監聽器數組的尾部。 |
2 |
on(event, listener) 爲指定事件註冊一個監聽器,接受一個字符串 event 和一個回調函數。 server.on('connection', function (stream) { console.log('someone connected!'); }); |
3 |
once(event, listener) 爲指定事件註冊一個單次監聽器,即 監聽器最多隻會觸發一次,觸發後立刻解除該監聽器。 server.once('connection', function (stream) { console.log('Ah, we have our first user!'); }); |
4 |
removeListener(event, listener) 移除指定事件的某個監聽器,監聽器必須是該事件已經註冊過的監聽器。 它接受兩個參數,第一個是事件名稱,第二個是回調函數名稱。 var callback = function(stream) { console.log('someone connected!'); }; server.on('connection', callback); // ... server.removeListener('connection', callback); |
5 |
removeAllListeners([event]) 移除所有事件的所有監聽器, 如果指定事件,則移除指定事件的所有監聽器。 |
6 |
setMaxListeners(n) 默認情況下, EventEmitters 如果你添加的監聽器超過 10 個就會輸出警告信息。 setMaxListeners 函數用於提高監聽器的默認限制的數量。 |
7 |
listeners(event) 返回指定事件的監聽器數組。 |
8 |
emit(event, [arg1], [arg2], [...]) 按監聽器的順序執行執行每個監聽器,如果事件有註冊監聽返回 true,否則返回 false。 |
Node.js的全局對象
JavaScript 中有一個特殊的對象,稱爲全局對象(Global Object),它及其所有屬性都可以在程序的任何地方訪問,即全局變量。
在瀏覽器 JavaScript 中,通常 window 是全局對象, 而 Node.js 中的全局對象是 global,所有全局變量(除了 global 本身以外)都是 global 對象的屬性。
在 Node.js 我們可以直接訪問到 global 的屬性,而不需要在應用中包含它。
Node.js中有不少常用的全局變量/函數,如:setTimeout,setInterval,console等。
我們也可以自定義全局變量/函數:
//定義
global.userName='Jimmy';
//使用
const name=global.userName;