createServer创建第一个Node.js程序
http模块的createServer函数实际调用V8引擎的C++库,对指定端口进行监听(socket)。当端口有连接访问时进行处理。
使用createServer函数搭建Node.js服务:
1 var http = require('http');//引用http模块 2 3 http.createServer(function (request, response) { 4 response.writeHead(200, {'Content-Type': 'text/plain'}); 5 response.end('Hello World '); 6 }).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 事件被触发。
1 var EventEmitter = require('events').EventEmitter; 2 var event = new EventEmitter(); 3 event.on('event_name', function() { 4 console.log('event_name事件触发'); 5 }); 6 setTimeout(function() { 7 event.emit('event_name'); 8 }, 1000);
执行结果:1s后输出“event_name事件触发”。
同一个事件对象可以添加多个监听者:
1 var events = require('events'); 2 var emitter = new events.EventEmitter(); 3 emitter.on('someEvent', function(arg1, arg2) { 4 console.log('listener1', arg1, arg2); 5 }); 6 emitter.on('someEvent', function(arg1, arg2) { 7 console.log('listener2', arg1, arg2); 8 }); 9 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等。
我们也可以自定义全局变量/函数:
1 //定义 2 global.userName='Jimmy'; 3 //使用 4 const name=global.userName;