经过使用HTTP
模块的低级API,Node.js
容许咱们建立服务器和客户端。刚开始学node
的时候,咱们都会遇到以下代码:html
var http = require('http'); http.createServer(function (req,res) { res.end('Hello World\n'); }).listen(3000,"127.0.0.1"); console.log("Server running at http://127.0.0.1:3000");
这段代码的包括了http模块的信息,意思是:前端
1.从`Node.js`的核心请求HTTP模块并赋予一个变量,以便在之后的脚本中使用。 因而脚本就能够访问一些方法来经过`Node.js`使用`HTTP`。 2.使用`createServer`建立新的web服务器对象 3.脚本将一个匿名函数传递给服务器,告诉web服务器对象每当其接收到请求时会发生的是什么 4.脚本第4行定义了web服务器的端口和主机,这意味着可使用`http://127.0.0.1:3000` 来访问服务器
对于每一个HTTP
请求和响应,都会发送HTTP
头,HTTP
头发送的是附加的信息,包括内容类型、服务器发送响应的日期以及HTTP
状态码node
http
头包含了许多信息,如下是个人百度首页包含的http
头的信息:web
因为个人百度首页添加了较多的网站,因此这里的数据和读者们的可能不同。从中咱们能够看出百度是web服务器是BWS/1.1
数据库
下面是刚才上面那段代码的http头部信息:编程
在node中,咱们能够很容易地建立一个简单的服务器将访问者重定向到另一个Web页面上,其准则以下:api
1.给客户发送301响应代码,告诉客户,资源已经移到另外一个位置了; 2.发送一个位置头告诉客户重定向到哪里。
相关代码以下:数组
var http = require('http'); http.createServer(function (req,res) { res.writeHead(301,{ 'Location':'Http://example-2.com/web' }); res.end(); }).listen(3000,'127.0.0.1'); console.log("Server funning at http://127.0.0.1:3000");
打开浏览器访问http://127.0.0.1:3000
页面会被重定向。浏览器
Node.js
不单能够建立单一的响应,对于多种类型的请求,咱们须要给应用程序加一些路由。Node
经过使用URL
模块让这一切直截了当。URL
模块使咱们能够读取URL
、分析它而后对输出作一些事情。服务器
var url = require('url'); var requestURL = "http://example.com:1234/path?query=string#hash"
如今,咱们能够分析请求的URL并从中截取内容,例如,要想得到主机名称,咱们能够输入:
url.parse(requestURL).hostname
这时,他将返回"example.com"
取得端口号能够输入:
url.parse(requestURL).port
他将返回“1234”
Node.js
被认为是实现并发的最佳方法。Events
(事件)模块是Node.js的核心,许多其余模块用它来围绕着事件架构功能。因为Node.js
运行于单一的线程中,任何同步代码都是阻塞的。因此,在编写Node.js
代码的时候咱们要考虑一些简单的规则:
1.别阻塞——`Node.js`是单线程的,若是代码阻塞的话全部其余一切都中止了 2.快速返回——操做应当快速返回。若是不能快速返回,就应当将其迁移到另外一个进程中
Events模块让开发人员能够为事件设置侦听器和处理器。在客户端js中,咱们能够对单击事件设置一个监听器,而后在事件发生时执行一些事情:
var tar = document.getElementById("target"); tar.addEventListener("click", function () { alert("click event fired,target was clicked"); },false);
固然,这是在不考虑IE兼容性的一个例子,Node.js
重点事件更常见的是网络事件,包括:
1.来自web服务器的响应 2.从文件读取数据 3.从数据库返回数据
使用Events
模块咱们首先要建立一个新的EventEmitter
实例:
var EventEmitter= require('events').EventEmitter; var test = new EventEmitter();
一旦在代码中加入上述内容,就能够添加事件和侦听器了,咱们能够按以下方法发送事件,好比:
test.emit('msg','the message send by node');
第一个参数是对事件进行描述的字符串,以便用于侦听器的匹配
为了接收消息,就必须添加侦听器,侦听器在事件触发时处理它,例如:
test.on('message',function(data){ console.log(data); });
Events
模块addListener/on,once,removeListener,removeAllListeners,emit
等基本的事件监听模式的方法实现。它与前端DOM
树上的事件并不相同,由于它不存在冒泡,逐层捕获等属于DOM
的事件行为,也没有preventDefault()、stopPropagation()、 stopImmediatePropagation()
等处理事件传递的方法。
1.类: events.EventEmitter:经过 require('events').EventEmitter 获取 EventEmitter 类。 2.emitter.on(event, listener):添加一个 listener 至特定事件的 listener 数组尾部。 返回 emitter,方便链式调用,下同。 3.emitter.removeListener(event, listener)从一个事件的 listener 数组中删除一个 listener 4.emitter.listeners(event)返回指定事件的 listener 数组
更多详情见:Node.js API 文档
如下代码展现了一条能在5秒内自我毁灭的机密消息:
var EventEmitter = require('events').EventEmitter; var secretMessage = new EventEmitter(); secretMessage.on('message', function (data) { console.log(data); }); secretMessage.on('self destruct', function () { console.log('the msg is destroyed!'); }); secretMessage.emit('message','this is a secret message.It will self deatruct in 5s'); setTimeout(function () { secretMessage.emit('self destruct'); },5000);
在这段脚本中,发送了两个事件,有两个侦听器。当脚本运行时,消息事件就发生,并由“message
”处理器处理
在Node.js
中处处都用EventEmitter
,因此掌握它是很重要的。Node.js
经过I/O
操做得到的数据并普遍使用Events
模块来支持异步编程
问:对于一个事件是否有最大侦听器数量的限制?
答:默认状况下,若是事件有操做10个侦听器,它会发出警告。不过,可使用emitter.setMaxListener(n)
来更改这个数量
问:是否能够侦听全部发送出来的事件? 答:不能。咱们须要给每一个想要响应的事件建立侦听器