Node实践之二
先从一个简单的demo说起,用cmd打开命令提示符,输入echo Hello,大家是不是看到终端上显示出了Hello字样,事实上这就是一个简单的事件。
回到正题,相信提到node.js,免不了让人想起非阻塞、回调、事件循环、并发、网络编程等。(在此强调一下并发:许多人同时尝试做同样的事情),下面将主要介绍一下node.js的特色功能!
回调
相信大家到回调应该不陌生,简单一点的说就是函数可以作为参数传递给另外一个函数中,然后被调用。我们来看看node.js是如何使用回调的,用例子说话!(哈哈)
var fs = require('fs');
fs.readFile('somefile.txt', 'utf8', function (err, data) {
if (err) {
throw err;
}
console.log(data);
});
回调函数中的第一个参数err,用于保存在读取文件时返回的错误。
回调函数中的第一个参数err,用于保存读取文件所返回的数据。
Node.js以提供一个创建联网应用程序的平台为目标,回调是Node.js实现网络编程的关键方法,因为回调让代码在其事件发生的时候才能运行。基于网络的I/O是不可预测的,事件驱动编程是处理不可预测性的极佳方式,回调产生是负责解决不可预测性的方法,它也是处理并发的高效方法。
回调的相关Demo
1、建立一个app.js,代码如下
var http = require('http'),
urls = ['shapeshed.com', 'www.bbc.co.uk', 'edition.cnn.com'];
function fetchPage(url) {
var start = new Date();
http.get({ host: url }, function (res) {
console.log('Got response from:' + url);
console.log('Request took:' + (new Date() - start) + 'ms');
});
}
for (var i = 0; i < urls.length; i++) {
fetchPage(urls[i]);
}
2、运行 node.app 多执行几次 仔细看结果 从这个例子中我相信你应该能够体会基于网络的I/O是不可预测的,事件驱动编程是处理不可预测性的极佳方式,回调产生是负责解决不可预测性的方法,它也是处理并发的高效方法。
事件循环
Node.js运行在单一的进程中并且要求开发人员使用异步编码风格。(同步和异步的概念在此不赘述了)
网络经常不是开发人员所能控制的,我们可能要从不属于我们的远程服务器获取代码并处理,通过使用异步风格可以让脚本在网络事件返回时响应。
事件循环使得系统可以将回调函数先保存起来,而后当事件在将来发生时再运行。
事件循环的关键思想是将代码围绕着事件来构架而不是按照期待中的输入顺序来构架,由于事件循环以单一进程为基础,所以为了确保高性能,需要遵循以下一些规则:
- 函数必须快速返回
- 函数不得阻塞
- 长时间运行的操作必须移到另一个进程中
HTTP
网络编程免不了要了解一下HTTP,事实上它定义了服务器与客户端在通信时应该如何发送和接收数据。通过使用HTTP模块的低级应用程序编程接口,Node.js既允许我们创建服务器也允许我们创建客户端。
讲到http,大家自然而然的会想到URL。看一段代码。
var http = require('http'),
url = require('url');
http.createServer(function (request, response) {
var pathname = url.parse(request.url).pathname;
if (pathname === '/') {
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.end('Home Page ! ');
} else {
if (pathname === '/about') {
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.end('About Us ! ');
} else {
if (pathname === '/redirect') {
response.writeHead(301, { 'Location': '/' });
response.end();
} else {
response.writeHead(404, { 'Content-Type': 'text/plain' });
response.end('Page not found ! ');
}
}
}
}).listen(3000, '127.0.0.1');
console.log(' change!');
运行之后,打开浏览器访问http://127.0.0.1:3000
http://127.0.0.1:3000/about
http://127.0.0.1:3000/redirect
http://127.0.0.1:3000/hello
看到的结果各不一样,这就是路由起的效果。
在大家眼里,似乎HTML客户端就是浏览器,事实上HTML客户端可以是任何对服务器请求响应的东西。
看了上面的代码可能大家会很困惑,我用Node.js需要了解那么多HTTP里面的细节,会不会太麻烦了,下面Express粉墨登场了。
Express
简单一点的一句话介绍Express就是Node.js的一个Web框架。
使用npm install -g express命令来安装Express(友情提示:这里使用了-g是因为我们是用的全局安装)
创建一个基础的Express站点
1、打开终端,输入express [siteName](注意这里的siteName是你自定义的网站名称)
2、cd siteName && npm install
3、node app
4、打开web浏览器,输入http://127.0.0.1:3000/
Node实践之二的更多相关文章
- Cookie和Session在Node.JS中的实践(二)
Cookie和Session在Node.JS中的实践(二) cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的实践(一)已经是写得算是比较详细了,有兴趣可以翻看,这篇是s ...
- [独孤九剑]持续集成实践(二)– MSBuild语法入门
本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...
- Scrum&Kanban在移动开发团队的实践 (二)
Scrum&Kanban在移动开发团队的实践系列: Scrum&Kanban在移动开发团队的实践 (一) Scrum&Kanban在移动开发团队的实践 (二) 在第一篇分享文章 ...
- Xamarin.Android开发实践(二)
原文:Xamarin.Android开发实践(二) 一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_qu ...
- 基于Sql Server 2008的分布式数据库的实践(二)
原文 基于Sql Server 2008的分布式数据库的实践(二) 从Win7连接Win2003的Sql Server 2008 1.新建链接服务器链接到Win2003的Sql Server 2008 ...
- javascript中的promise和deferred:实践(二)
javascript中的promise和deferred:实践(二) 介绍: 在第一节呢,我花了大量的时间来介绍promises和deferreds的理论.现在呢,我们来看看jquery中的promi ...
- Django入门实践(二)
Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...
- kafka原理和实践(二)spring-kafka简单实践
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- 百度APP移动端网络深度优化实践分享(二):网络连接优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...
随机推荐
- JVM之运行时常量池(Runtime Constant Pool)
基本特性: 方法区的一部分,在方法去中分配,加载泪或者接口后就创建运行时常量区. class文件每一个类或接口的常量池表(constant_pool table)的运行时表现形式, 包括编译期的数值字 ...
- sql优化阶段性总结以及反思
Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...
- Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)
本节我们讨论 Suspend/Resume 和 Rescue/Unrescue 这两组操作. Suspend/Resume 有时需要长时间暂停 instance,可以通过 Suspend 操作将 in ...
- 如何区分/dev/input/event
方法是把每一个/dev/input/event打开.通过ioctl函数来读取设备name,每一个设备name是固定的,可以根据name区分event.我这是查找触摸事件为例:代码如下: static ...
- JavaScript中知而不全的this
都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言.它把 函数式编程和 面向对象编程糅合一起,再加上 动态语言特性,简直强大无比(其实是不能和C++比的,^_^ ). 这 ...
- Source Insight常用功能设置
熟悉工具的使用能在一定程度上提高工作效率,但工具永远只是工具,大家要把重点放在内功的修炼上. 符号导航 符号(变量.宏定义.结构定义.枚举.函数等等)在SI 中的检索非常方便.Ctrl+鼠标左键或Ct ...
- Linux 内核中的 Device Mapper 机制
本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...
- 4412开发板学习笔记-NFS服务器的搭建
转自iTOP-4412讨论群: http://www.topeetboard.com 先来介绍一下NFS: NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件 ...
- 帆软报表FineReport2016年1月份产品更新一览
.条件属性可使用页码参数插件 由于报表计算逻辑关系,条件属性中取不到页码公式.但是有些场景下又是需要在条件属性中取到页码的,比如标题只要偶数页显示,比如奇数页标题标红等等. 插件安装完成后,条件属性里 ...
- C#创建委托实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyDe ...