Node.js中HTTP模块与事件模块详解


Posted in Javascript onNovember 14, 2014

Node.js的http服务器

通过使用HTTP模块的低级API,Node.js允许我们创建服务器和客户端。刚开始学node的时候,我们都会遇到如下代码:

var http = require('http');

http.createServer(function (req,res) {

    res.end('Hello World\n');

}).listen(3000,"127.0.0.1");

console.log("Server funning 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头发送的是附加的信息,包括内容类型、服务器发送响应的日期以及HTTP状态码

http头包含了许多信息,以下是我的百度首页包含的http头的信息:

Node.js中HTTP模块与事件模块详解

由于我的百度首页添加了较多的网站,所以这里的数据和读者们的可能不一样。从中我们可以看出百度是web服务器是BWS/1.1

下面是刚才上面那段代码的http头部信息:

Node.js中HTTP模块与事件模块详解

Node.js中的重定向

在node中,我们可以很容易地创建一个简单的服务器将访问者重定向到另外一个Web页面上,其准则如下:

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)来更改这个数量

问:是否可以侦听所有发送出来的事件?
答:不能。我们需要给每个想要响应的事件创建侦听器

Javascript 相关文章推荐
用javascript实现的仿Flash广告图片轮换效果
Apr 24 Javascript
JQuery 选项卡效果(JS与HTML的分离)
Apr 01 Javascript
Jquery中val()表单取值赋值的实例代码
Aug 15 Javascript
js的onload事件及初始化按钮事件示例代码
Sep 25 Javascript
JS 删除字符串最后一个字符的实现代码
Feb 20 Javascript
JS实现为表格动态添加标题的方法
Mar 31 Javascript
jQuery使用正则验证15/18身份证的方法示例
Apr 27 jQuery
基于vue-ssr服务端渲染入门详解
Jan 08 Javascript
JQuery选中select组件被选中的值方法
Mar 08 jQuery
vue mint-ui tabbar变组件使用
May 04 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 Javascript
JS实现公告上线滚动效果
Jan 10 Javascript
jquery中append()与appendto()用法分析
Nov 14 #Javascript
jQuery 插件开发指南
Nov 14 #Javascript
使用JavaScript和C#中获得referer
Nov 14 #Javascript
JavaScript window.location对象
Nov 14 #Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 #Javascript
详谈JavaScript内存泄漏
Nov 14 #Javascript
js与C#进行时间戳转换
Nov 14 #Javascript
You might like
php 上传功能实例代码
2010/04/13 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
js代码实现微博导航栏
2015/07/30 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
Python3实现转换Image图片格式
2018/06/21 Python
django解决跨域请求的问题
2018/11/11 Python
ipython和python区别详解
2019/06/26 Python
python基于递归解决背包问题详解
2019/07/03 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
django使用graphql的实例
2020/09/02 Python
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
项目副经理岗位职责
2013/12/30 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
股东合作协议书
2014/04/14 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
《穷人》教学反思
2016/02/19 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
决心书格式及范文
2019/06/24 职场文书