说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

专门针对初学者的Node.js教程

HTML文档下载 WORD文档下载 PDF文档下载
这是一篇专门针对Node.js初学者的教程。该教程将通过具体实例,教你一步步开始Node.js之旅。

Node.js的教程并不缺乏,但有大部分教程针对已有Node.js基础的开发者。“我已下载了Node.js,可我如何开始呢?”以下教程是专门针对Node.js初学者,文中将通过实例分享,一步步教你如何开始Node.js之旅。  

什么是Node.js?

很多初学者并没有真正地理解Node.js到底是什么。nodejs.org网站中的描述也没有多大帮助。

首先要清楚Node不是一个Web服务器,这十分重要。它本身并不能做任何事情。它无法像Apache那样工作。如果你希望它成为一个HTTP服务器,你必须借助它内置库自己编写。Node.js只是计算机上执行代码的另一种方式,它是一个简单的JavaScript Runtime.

安装Node.js

Node.js的安装十分容易。只需在这里下载满足你需要的安装程序即可。

已安装好Node.js,下一步做什么?

安装结束后,你可以输入一个新命令“node”。使用该“node”命令有两种不同的方法。第一种不带任何参数,将打开一个交互式Shell“>”(REPL: read-eval-print-loop),你可以在这里执行JavaScript代码。

$ node> console.log('Hello World');Hello Worldundefined


上面案例中,我在Shell中键入了“console.log('Hello World')”,并敲回车。Node便开始执行该代码,并显示刚才记录的信息,同时打印出“undefined”。这是因为每条命令都会返回一个值,而console.log没有任何返回,故输出“undefined”。

Node命令的另一种用法是执行一个JavaScript文件。这是我们平时最常用的方法。

hello.js

<b>console.log('Hello World');</b>
<b>$ node hello.jsHello World</b>


该案例中,我将“console.log('Hello World');”命令存入一个文件中,并将该文件作为node命令的参数。Node运行文件中JavaScript代码,并输出“Hello World”。

案例一:文件的输入与输出

Node.js包含一组强大的库(模块),可以帮助我们做很多事。第一个案例中,我将打开一个Log文件,并对它进行解析。

example_log.txt

<b>2013-08-09T13:50:33.166Z A 22013-08-09T13:51:33.166Z B 12013-08-09T13:52:33.166Z C 62013-08-09T13:53:33.166Z B 82013-08-09T13:54:33.166Z B 5</b>

该Log数据什么意思并不重要,基本可以确定每条信息都包含一条数据、一个字母和一个值。我希望将每个字母后面的值进行累加。

我们要做的第一件事是读出文件的内容。

my_parser.js

<b>// Load the fs (filesystem) modulevar fs = require('fs');// Read the contents of the file into memory.fs.readFile('example_log.txt', function (err, logData) {  // If an error occurred, throwing it will  // display the exception and end our app.  if (err) throw err;  // logData is a Buffer, convert to string.  var text = logData.toString();});</b>

通过内置的文件(fs)模块,我们可以很容易进行文件的输入/输出操作。fs模块有一个readFile方法,该方法以文件路径、回调函数为参数。该回调函数在完成文件读取后调用。文件数据读取后存储在Buffer类型中,为基本的字节数组。我们可以通过toString()方法将它转化为字符串。

现在我们对它进行解析。

my_parser.js

<b>// Load the fs (filesystem) module.var fs = require('fs');// Read the contents of the file into memory.fs.readFile('example_log.txt', function (err, logData) {  // If an error occurred, throwing it will  // display the exception and kill our app.  if (err) throw err;  // logData is a Buffer, convert to string.  var text = logData.toString();  var results = {};  // Break up the file into lines.  var lines = text.split('\n');  lines.forEach(function(line) {    var parts = line.split(' ');    var letter = parts[1];    var count = parseInt(parts[2]);    if(!results[letter]) {      results[letter] = 0;    }    results[letter] += parseInt(count);  });  console.log(results);  // { A: 2, B: 14, C: 6 }});</b>

现在,当你将该文件作为node命令的参数时,执行该命令将打印出如下结果,执行完毕后退出。

$ node my_parser.js{ A: 2, B: 14, C: 6 }


我大部时候将Node.js作为脚本使用,正如上面所展示的那样。它更易于使用,是脚本程序有力的替代者。

异步回调

正如在上例中看到的那样,Node.js典型的模式是使用异步回调。基本上,你告诉Node.js要做的事,它执行完后便会调用你的函数(回调函数)。这是因为Node是单线程的。在你等待回调函数执行过程中,Node可继续执行其他事务,不必被阻塞直到该请求完毕。

这对于Web服务器尤其重要。在现代Web应用访问数据库的过程中特别普遍。当你等待数据库返回结果的过程中,Node可以处理更多请求。与每次连接仅处理一个线程相比,它使你以很小的开销来处理成千上万个并行连接。

案例二:HTTP服务器

Node内建有一个模块,利用它可以很容易创建基本的HTTP服务器。请看下面案例。

my_web_server.js

<b>var http = require('http');http.createServer(function (req, res) {  res.writeHead(200, {'Content-Type': 'text/plain'});  res.end('Hello World\n');}).listen(8080);console.log('Server running on port 8080.');</b>

在上面,我说是的基本HTTP服务器。该例中所创建的并不是一个功能全面的HTTP服务器,它并不能处理任何HTML文件、图片。事实上,无论你请求什么,它都将返回“Hello World”。你运行该代码,并在浏览器中输入“http://localhost:8080”,你将看见该文本。

$ node my_web_server.js

现在你可能已经注意到一些不一样的东西。你的Node.js应用并没有退出。这是因为你创建了一个服务器,你的Node.js应用将继续运行,并响应请求,直到你关闭它。

如果你希望它成为一个全功能的Web服务器,你必须检查所收到的请求,读取合适的文件,并返回所请求的内容。值得高兴的是,有人已经帮你做了这个艰难的工作。

案例三:Express框架

Express为一个框架,可使创建网站的过程十分简单。你首先需要安装它。除了node命令,你还需要访问“npm”命令。利用该工具,你可以访问社区所创建的庞大模块集。其中之一就是Express。

$ cd /my/app/location$ npm install express

当你安装了一个模块,它将出现在应用程序所在目录的“node_modules”文件夹中。现在我们可以利用Express来创建一个基本的静态文件服务器。

my_static_file_server.js

<b>var express = require('express'),    app = express();app.use(express.static(__dirname + '/public'));app.listen(8080);</b>

$ node my_static_file_server.js

现在你已创建了一个强大的静态文件服务器。你可以通过浏览器请求访问你放在public文件夹中任何文件,并进行展示,包括HTML、图片等任何东西。比如,把一个名为“my_image.png”的图片放在public文件夹中,你可以在浏览器中输入“http://localhost:8080/my_image.png”来访问该图片。当然,Express还有很多特性,你可以在以后的开发中继续探索。

NPM

上面我们已经接触到了npm,但我仍想强调一下在Node.js开发过程中该工具的重要性。它有成千上万个模块可帮我们解决遇到的大部分典型问题。在重新发明轮子之前,记得检查一下npm中是否有相应功能。 

上一例中,我们手动安装了Express。如果你的程序包含很多“依赖”(Dependency),那再利用该方法安装它们就不合适了。为此npm提供了一个package.json文件。

package.json

<b>{  "name" : "MyStaticServer",  "version" : "0.0.1",  "dependencies" : {    "express" : "3.3.x"  }}</b>

package.json文件包含了应用程序的基本信息。其中“dependencies”部分描述了你想安装模块的名称和版本。该案例,接受Express 3.3的任何版本。你可以在该部分列出你想要的所有依赖。

代替之前一个个安装每个依赖,现在我们可以运行一个命令,即可将它们全部安装完成。

$ npm install

运行该命令,npm将在当下文件夹中查找“package.json”文件。一旦找到,即可安装所列出的所有依赖。

代码的组织

在大部分应用程序中,你的代码往往被分割到几个文件中。现在让我们把最开始案例中的Log分析脚本分离出来。这样该程序将更易于测试与维护。

parser.js

<b>// Parser constructor.var Parser = function() {};// Parses the specified text.Parser.prototype.parse = function(text) {  var results = {};  // Break up the file into lines.  var lines = text.split('\n');  lines.forEach(function(line) {    var parts = line.split(' ');    var letter = parts[1];    var count = parseInt(parts[2]);    if(!results[letter]) {      results[letter] = 0;    }    results[letter] += parseInt(count);  });  return results;};// Export the Parser constructor from this module.module.exports = Parser;</b>

在此创建了一个新文件,来存放Log分析脚本。这仅仅是一种标准JavaScript,还有很多方法可用来封装该代码。我选择重新定义一个JavaScript对象,这样更容易进行单元测试。

该程序中最重要的部分是“module.exports = Parser;”这一行代码。它告诉Node从该文件中要输出的内容。在该例中,我输出了构造函数,用户可以用Parser对象来创建实例。你可以输出任何你想要的。

现在我们看一下,如何导入该文件,来使用Parser对象。

my_parser.js

<b>// Require my new parser.js file.var Parser = require('./parser');// Load the fs (filesystem) module.var fs = require('fs');// Read the contents of the file into memory.fs.readFile('example_log.txt', function (err, logData) {  // If an error occurred, throwing it will  // display the exception and kill our app.  if (err) throw err;  // logData is a Buffer, convert to string.  var text = logData.toString();  // Create an instance of the Parser object.  var parser = new Parser();  // Call the parse function.  console.log(parser.parse(text));  // { A: 2, B: 14, C: 6 }});</b>

如模块一样,文件被引入其中,你需要输入路径,而非名称。

总结

希望该教程可以帮助到你。Node.js是一个强大、灵活的技术,可以帮助解决各种各样的问题。它已经超出了我们的想像。(编译:陈秋歌 审校:夏梦竹)

原文链接:An absolute beginner's guide to Node.js

VB修改注册表一特例 VB与VC混合编程中处理消息的方法 VB中的进制转换是怎样的? VB中调用带参数存储过程的实现(数据库) VB中感叹号“!”与圆点“.”的用法差异 VB中如何实现注册表的读写 VB中实现“擦视”技术 Visual Basic 2000年问题 Visual Basic 的未来 Visual Basic 命令分类表 Visual Basic三级跳 Visual Basic使用技巧 Visual Basic中的子类处理技术 Visual Basic中软件封面技术探秘 VisualBasic 软件设计中的几个问题 Windows 95/NT 运行了多长时间 -VB资料 Windows 的登录资料库 -VB资料 把回车键变成TAB键-VB资料 把文件置入到Text或RichText中 -VB资料 避免按 [ENTER] 回车键产生的“嘀”声 -VB资料 避免使用全局变量-VB资料 避免装载多份应用程序-VB资料 不定个数的参数 -VB资料 不在任务栏中显示,只能在Ctrl+Alt+Del对话框中显示或者干脆什么也不显示数 -VB资料 处理 Dropdown List型 Combo的录入问题-VB资料 VB创建和删除快捷方式 从程序中生成 exe 文件 -VB资料 打开和关闭CD-ROM 驱动器 -VB资料 打开和关闭其他应用 -VB资料 打开一个超连接 -VB资料 当前操作系统的语言集-VB资料 在命令行下,怎么配置route呢?????????? 又是project问题 為何JAVABEANS不能接收JSP傳遞過來的數值時數據? delphi线程问题(急!急!!在线等待) win2k的domain怎么和NT4的domain建立信任关系,谢谢 如何将Response.OutPutStream输出到指定的window?比如由window.open()得到的handle? DELPHI的帮助? 编了一段很小的程序,报了一个很低级的错误(编译通过) DELPHI的帮助? 各位高手高高手快来帮我个忙吧! 谁正在读《C++Builder5编程实例与技巧》之四--例程S04E的问题,在第151页下面 后台程序如何捕捉鼠标左键单击时间 高分求函数!!!!!!! (多项式方程求根) va_... 系列宏 有谁用过DELPHI+DB2数据库的应用? 今年3月開始學習Java,現在剛剛寫出來一個俄羅斯方塊,我想進一步提高,不知我要往哪方面發展。 调查:大家对用Flash做程序介面有没有兴趣?Up也有分 请教高手,这个查询该怎么写???(加急!!) 高分求Sybase在Win2000下的安装、配置手册(一定给分) 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教) 如何在vb中获得Excel对象行数,列数 请问PFC倒底是干什么用的? 用jsp提交到oracle8.05的汉字怎么是乱吗,希望能得到回答 我可以在存储过程执行非常复杂的计算吗? 请教高手,这个查询该怎么写???(加急!!) 消息剖析器--无法回复,故贴出来让有疑惑的人得以走捷径 把一个ansi码的*.Txt转换为Unicode码的.Txt文件 ACCESS数据库加密解密问题!!! 关于MFC类库和VCL类库的问题? 天那,这样也会错?$mydb[$i][fair_type_name] 谁能帮我解决installshield这个问题奖励100分 连接数据库的问题: 关于字符串 用vb在word里面怎么绘制表格和在往表格里面放数据 请求一个源文件! 我有一张光盘,(内含3个完整的不同版的winXP操作系统)!看一下所有文件大小,竟然有1个多G?这是为什么? 怎样判断tclientsocket已经联到服务端 test 哪里有Visual Studio .NET 正式版下载 如何让程序出现异常自己处理,不让系统处理 超星图书阅览器注册问题?请人帮忙! 在日文做作系统中配置中文环境 我想扫描网络上发过来的所有IP包,想用RAW_SOCKET,那里可以找到这方面的文章? 请问如何实现窗口或者面扳的平滑移动,类似VS。NET中的效果 ACCESS的问题 能不能不工作找兼职或接项目,应该怎么找?有经验的请多多帮忙,重分相谢。 请关注!一个下拉菜单的显示问题! datastore 出错~~~ 请问如何在HtmlView中得到服务响应的head数据 如何不加载多文挡里的菜单 关联的两个下拉表单! 短路现象的科学解释 圆柱水槽有10厘米深的水,它的底面积是300平方厘米,将棱长6厘米的正方体块放入水中,水面将上升多少厘米 18650电池连接普通的发光二极管用怎样的电阻? java短路现象程序解读public class ShortCut{public static boolean test(int a){System.out.println("come in and a=" + a);return a > 1;}public static void main(String[] args){if( test(0) && test(1) ){System.out.println("result is true");}else{Syst 一个圆柱形水槽里面盛有10厘米深的水,水槽的底面积是300平方厘米.将一个棱长6厘米的正方体铁块放人水中 一只接在一节18650锂电池上的普通LED灯泡,接上多少欧的电阻最合适, 短路现象解释(用欧姆定律)短路后,相当于一个极小的电阻和用电器并联,并联电路中,电压处处相等,所以用电器两端的电压不变,用电器电阻不变,所以电流应该不变啊 为什么我国是世界最大的碳排放国?如何减少碳排放? . 如图所示,长为1.5米的轻质木板OA(质量不计)的一端能绕轴O转动,另一端用一细绳把木板吊成水平细绳能承受的最大拉力为5牛.物重为7.5牛的小球在水平拉力F(F=2牛)的作用下,从O点开始沿O 短路电器可以看作导线吗、短路咋解释.短路为撒有危害,咋判断短路,举例说明短路现象,电路中被短路的地方有电流经过吗 地球一小时活动,低碳,体现了我们的什么发展战略,为此,我国制定了哪些国策 如图,细绳一端固定于转轴O点,另一端系有质量为M的小球,小球离地面高度为L,如图,细绳一端固定于转轴O点,另一端系有质量为M的小球,小球离地面高度为L,给小球以初速度v使它在竖直平面内做 灼烧生发石有烧焦羽毛的气味如题,对“白发”研究,发现主要成分是一种海洋生物头盘中的标本由此判断“生发石”中可能含有( )括号里填一种有机物的名字.是海洋生物头盘中的标本会是 我国控制碳排放量的合理措施有哪些 10牛的水能产生大于10牛的浮力吗?有好多种回答的、看得我都糊涂了、、高手帮下忙、麻烦解释一下、谢谢!当所有的水都成为排开的液体时,那么排开水的重力不就是10牛的水吗? 将皮革灼烧时有烧焦羽毛的气味吗? 中国2009,2010年的碳排放量占全球百分之几?急用, 100牛的水能产生大于100牛的浮力吗?为什么?不要复制别人的回答。 分别用一节干电池和两节干电池给一个小灯泡供电,哪儿一次小灯泡更亮?这一事实说明改变什么可以改变电路中的电流? 一个圆柱形水槽里盛有10厘米深的水,水槽的底面积是144平方厘米.将一个棱长6厘米的正方体铁块放入水中,水面将上升几厘米? 重力为十牛的水能对物体产生超出十牛的浮力.谁能帮我理解下这个? 现在全球每年二氧化碳排放量是多少?工业生产排放占多大比重?中国呢?现在全球一年二氧化碳排放量是多少?增长率如何?工业生产排放占多大比重?现在中国一年二氧化碳排放量是多少?增长率 为什么大肠杆菌里的限制酶不把自己的DNA切了看到别人说是有切点的基因被甲基化了 我查了甲基化的概念 :是指生物细胞内基因的选择性表达,未表达的基因就被甲基化了那大肠杆菌是单细 1牛的水能产生100牛的浮力吗?答案是能的,但我不知道原理,似乎阿基米德原理指的V排指的是V上升+V溢出,这两者相加才是V排才对. 中国的低碳排放量?还有统计图 导入了目的基因的一个质粒,导入到一个大肠杆菌中,那么 大肠杆菌中的限制酶和原有质粒不会对携带目的基因的质粒进行破坏么? 8牛的水能产生10牛的浮力吗?为什么? 为什么基因测序前将基因PCR克隆后还要放到大肠杆菌载体上再测序?除了防止PCR产物降解外还有别的原因吗? 大肠杆菌质粒DNA没有酶切进行电泳,跑出来的条带大约应该是多少bp?有没有比较好的标准的可参考图? 9个LED灯(3.2V/18mA下正常工作)并联,电源5V/500mA,需要加多大电阻才能使LED灯泡全亮 1、如何以大肠杆菌的质粒DNA为载体克隆一个编码动物的技术的基并使之在大肠杆菌中表达2、简要说明实验中可能遇到的问题及解决办 酶切成功,连接不成功,导入感受态,意思是感受态制备成功,导入质粒被切开,但是没有连接目的基因,最后导入感受态细胞中,培养,图板.会长菌不呢? 8个红色led接5v电源需要多大的限流电阻 为什么质粒不用PCR增殖而要用大肠杆菌复制? 初三物理电路图中电往哪走,就是短路怎么看出来 5V 500mA 接25个LED 并联好还是串联好,需要加多大的限流电阻和限压电阻?LED 参数 :正常工作电压:3.0-3.2V正常工作电流:10-20 mA最大反向电压:5 V最大工作电流:20mA 如何以大肠杆菌质粒DNA为载体克隆一个编码动物激素的基因,并使之在大肠杆菌中进行 白色发光二极管6个并联,电源电压5V,串接一个15欧限流电阻可以吗?电源电压为5V,白色发光二极管6个(3.2V/20ma)并联后串接限流电阻,限流电阻计算如下:(5V-3.2V)/20ma×6=1.8V/0.12A(120ma)=15Ω选1/ LED白色高亮二极管要是用USB供电需要接多大的电阻?USB为5V 500ma 为什么用限制酶1切质粒,限制酶2切目的基因?一直不懂啊~质粒不是应该切个口就好了吗? 如何以大肠杆菌质粒DNA为载体克隆一个编码蛋白的基因,并使之在大肠杆菌中表达 电源电压为5V,LED的导通电压为1.5V,其正向电流在5mA~15mA时才能正常工作,问限流电阻取值范围是多少?如题,详细解释者有重谢.先谢过了! 基因工程中,需使用特定的限制酶切割目的基因和质粒,便于重组和筛选.已知限制酶I的识别序列和切点是--G基因工程中,需使用特定的限制酶切割目的基因和质粒,便于重组和筛选。已知限制 破绽 意思 12v电源串多大的电阻接4.5v的LED发光二极管 汽车电源(12v)接一个发光二极管(蓝色光,二极管原来用三节1.5v纽扣电池).还有一个发紫外线光的二极管也用三节1.5v纽扣电池,同上 怎么接这个12 将目的基因与质粒结合的过程中,是不是必须将目的基因的两端与切开的质粒两端都完全连接才可以呢?只连接一段是否可以? 如果中国不拥有核武器,世界将怎样看待中国?中国政府对全世界的公开承诺说明了什么 初三物理电路中什么情况下会短路 目的基因与质粒反向连接为什么就不能正确表达我的意思是构建基因表达载体是为了让目的基因控制的基因序列表达,而不是让质粒与目的基因共同构成的基因序列表达,目的基因的基因序列 用试剂盒提取干种子壳DNA,提取出来跑0.8%的琼脂糖凝胶电泳,没有条带出现;但将提取出的DNA,跑PCR,再跑1.5%的琼脂糖凝胶电泳,目的基因的条带出现且很明显,请问这是什么原因,怎么直接提取出 点燃纯棉与羊毛都会产生烧焦羽毛气味吗 羊毛、棉花燃烧后的气味 有3个选项 1 特殊气味 2 烧纸气味 3 烧焦羽毛气味 核试验成功,中国政府对全世界的公开承诺说明了什么? 手机电池给 1w led供电用多大电阻手机电池是3800hah 电压是3.7 led是350mA 3.4-3.6V 1W(瓦) 想做一个照明用的手电 需要加电阻吗 请高人指点先谢了 什么化学气体是烧焦的味道象线路板烧焦的味道 为了防止和消除核战争危险,中国政府向全世界公开承诺了什么?这又说明了什么? 1个5W Led灯和3个1W的灯接12伏电池该怎么接电阻接多大,电阻要多大功率.5W的灯要电压6伏其它的都3.3伏.如果要没计一个电源要怎么设计,有电路图吗?如果要驱动电源该怎么DiY。 怎样回收DNA片段? 面对日本的挑衅,中国政府做何回应.从中说明了什么? 1W的LED蓝光的,用6V电瓶做电源,需要串联多大的电阻,才能使LED达到最佳的亮度?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘