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

专门针对初学者的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

代价究竟高不高,苹果为什么要在Android专利诉讼上花费2亿美元? 产品与设计专题论坛(下):App之美 产品与设计专题论坛(上):扁平还是拟物?产品说了算! 首届移动娱乐游戏峰会:中外手游的交锋与对抗(下) 研发人员超过500,基金会金牌会员,华为豪赌OpenStack New way of thinking:索尼SmartWatch 2应用开发马拉松大赛圆满结束 离了你地球照样转,谷歌地图并非苹果的必需品 面试必备的9大成功秘诀 Chuck Goldman:乔布斯从来不会说苹果不是企业应用的公司 全球最大的图片社交分享网站Pinterest发布首个API UX设计程序的五个谬论 研发周报:2013年美国开发者薪资调查报告 【开源推荐】PredictionIO:构建预测功能的机器学习服务器 只需4步 百度SiteApp助力京华网移动版落地 Windows Azure开放公测5个月的收获 RDS添加PostgreSQL支持 几家欢喜几家忧 首届智能硬件峰会:解读硬件创业机遇与挑战(下) 平台与技术专题论坛(二):游戏开发实践分享及IE11新体验 看Twitter上市后的入职面试题 六届中国大数据技术大会PPT精粹(三) AMD推多款异构计算开发工具 着力打造APU软件生态系统 Ceylon 1.0发布:又一个“Java语言替代品”? HTML5开发工具:英特尔XDK New 苹果公司为何“情系”PrimeSense 微App专场:不同平台下微App开发运营那些事 25载工程经验,HBase七年——BDTC2013讲师Michael Stack 或许对你创业有所启示:10个英国快速增长的科技创业公司 小米游戏中心10月报告:分析各种手游活动之优劣 欢网王智勇:传统电视厂商须补互联网基因 透露与百度合作细节 支付宝声波支付之初体验 首款使用HSA架构的Kaveri APU、多款异构计算开发工具APU13上齐亮相 请问使用STL如何将字符串变成大写 OOAD 我对这段代码很困惑!!不知为何出错,请大虾指点一二!!! SQL Server数据库中支持的数据表的最大数是多少? 有会用SDL(Simple DirectMedia Layer)的么? 如何重新启动电脑啊 ooad 有人对xml文档及schema映射为数据库的记录和表作过研究吗? 窗体启动时,Load之后是什么事件 安装好了J2EESDK1。4后怎样运行JAVA程序? 有关DBGrid的问题 IBM的硬盘是不是很菜!惨啊!奉劝大家多多备份,不要买IBM的盘 合格的程序员应该具备哪些知识和技能? 在报表中如何显示出来----共n页/第几页 急寻广州深圳两地图书城管理软件公司 用jdk写出的application里的汉字很难看,有没有解决的办法? 面向对象分析与设计 那位有<<java大学教程>>的光盘,可不可以把光盘上的附录部分发给我!(100分) 关于win2000中的odbc的问题 vfw 软件工程师和程序员有什么不同? 一方有难,八方支援,我有疑难,你能否来? 唉。 发现有人还在吃糠。。。。痛心ing.............. 为什么我连不到mysql? 有什么比做ghost更好的硬盘数据备份方法? 请教:在dataGrid 中如何根据行值的不同,设置不同的颜色 一般菜的问题,不知道你遇到过没有,请大家过来看一下 分析与设计 3D場景鋸齒消除問題 一方有难,八方支援,我有疑难,你能否来? 发布新软件,请帮助测试 一个白痴问题!哪个函数可以去除字符串中的空格? 在两台服务器上的数据库间创建触发器的注意事项? 有一好的想法,但途中这个问题搞不定 各位高手,请问用API怎样获得本机的网卡的IP地址 面向对象ooad 有没有类似deltree功能的函数啊? weblogic初级问题 小问题, 如何把个DBIMAGE里的图片复制到剪贴板里去?? 如何正确更新ADO的记录 分全给出,各位大侠看一看为什么动态库中的窗体调不出来:。。。。 更佳编程之路(转贴) 菜鸟问什么是水晶报表? 我的第一次发问? 集思广益整理一下有关类型转换的函数!(出力的都有分!!!不够再加!!) 有高分!有高分!有高分!有高分! 大家都用什么工具来做J2ME开发?调查一下!!! 急!sql server中的数据备份我在用程序操作,应如何写那(在deplhi中) msdn的提问~~~ datagrid的滚动条上下滚动的事件是什么阿? OOAD提示 刚结束的一道中考物理题弹古筝时,演奏者的另一只手不断变换按弦的位置,这是为了改变弦发声时的A振幅B响度C音色D音调因为答案有分歧,所以希望你们给出答案时给个解释,我加10分 1 下列说法正确的是:A 匀速圆周运动是一种匀变速曲线运动B 向心力加速度描述线速度变化的快慢C 航天飞机中的物体处于失重状态,是因为地球对它的吸引力全部用来提供向心力D 做圆周运动 全站仪水平度盘不动,转动望远镜水平读数为什么变化? 室内要替换60W的白炽灯用多少的节能灯 低碳生活是指什么 全站仪引点时坐标读数是错的是什么问题?测站点和后视点都没有错.就是照准好了以后对中棱镜测点得出的坐标读数是错的.是不是全站仪坏了?有哪个见到这样的问题? 第二题,解方程, 22.单项选择( )22.---Are his pens ____________ desk?---Yes,____________ are.A.on his,it B.on my,you C.on his,they D.his,it’s 7x-x^2=10 x=? 5、如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒PQ,MN,当PQ在外力的作用下运动时,MN在磁场力作用下向右运动,则PQ所做的运动可能是 A.向右匀加速运动 B.向左匀加速运动C.向 2012 年2月10号星期五下的雪周记 急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急 10-7x=x+2 如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒PQ,MN,MN的左边有一闭合如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒PQ、MN,MN的左边有一闭合电路,当PQ在外力作用下 关于雪的周记!明天就交了, 利用因式分解计算如何算?(1-1/2^2)×(1-1/3^2)×………………x(1-1/2013^2) 例、如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒 PQ 、 MN ,当 PQ 在外力作用下运动时,MN 在磁场力的作用下向右运动,则 PQ 所做的运动可能是( BC )A .向右加速运动B .向左加 周记怎么写啊?急 怎么算因式分解 现有甲“220伏100瓦”、乙“110伏100瓦”、丙“36伏100瓦”三个灯泡,分别在额定电压下工作哪个灯最亮 谁能给一篇关于校园的周记!400字左右的! 帮我算一下.因式分解 四年级上册简算60 全站仪坐标放样要分盘左盘右吗? 铝粉的主要用途是什么? 四年级上册简算1390-390÷15怎样算? 中纬全站仪的盘左盘右怎么判断 色漆中铝粉的作用是什么? 如图所示,电源电动势为12V,内电阻为1 Ω ,R1=3 Ω ,R2=2 Ω ,R3=4 Ω ,C1=4µF,C2=1µF ,则C1所带电量为多少C,C2所带电量为多少C. 已知在10只产品中有2只次品,在其中取两次,每次任取一只,作不放回抽样求下列事件的概率:2只都是正品.一只是正品,一只是次品.第2次取出的是次品.是用排列还是组合啊. 铝粉用途 C5H12 是什么东西啊 它的碳原子可能共面么 【考试在线】有10件产品,其中有2件次品,每次抽取1件检验,抽检后不放回,共抽2次.求下列事件的概率问题一,两次抽到的都是正品问题二,第一次抽到正品,第二次抽到次品问题三,抽到的恰有一 铝粉主要有哪些?用途是什么 低碳生活是指什么啊? 在10件产品中有2件次品,现从中无返回抽取3件,计算下列事件的概率:(1)恰有2件正品 (2)含有次品 牛的头数比羊的只数多25%,羊的只数比牛的头数少百分之几?要用方程法,要有算式、过程、结果. C5H12的碳原子为什么不共面我知道每个CH3是空间正四面体,但C原子可以共面啊 正戊烷分子中的5个C原子是可以共面吗?我们老师说不能。 雪的周记500字 两个乘积的3/1是-6,其中一个数是-4的绝对值的八倍,求另一个数. C5H12的碳原子是否在同一平面内 帮我写周记给分不要写雪 世界上到底有没有鬼这类的东西啊 有太多无法解释的事了! 英语 单项选择 (31 20:10:12)The rain was ____ heavy ____Cindy had to stop to buy an umbrella.A.too toB.so thatC.such thatD.as as选哪个?为什么? 上海市奉贤中学我能上吗?我现在户口在浦东新区,我妈妈想把我的户口迁到奉贤青村镇,我在长岛中学读初二,排名在年级前十左右(100分的卷子四门平均92左右,数学大概95左右)古筝7级,女,我 解方程组2x+3y=240 x+2y=150, al最高价氧化物的水化物是什么?(请写出方程式) “自从我上中学以后‘’用英语怎么表达 '奇妙'是什么意思了 碘的最高价氧化物对应的水化物分子式是什么 中学同学用英文怎么说啊?美国人真是的! “很神奇”有什么特别的意思? 英语 英语的烦恼 (27 20:12:5)我什么英语成绩提不高  英语翻译 求1.2.3. 最高价氧化物的水化物中,酸性最强的化合物的分子式是什么,名称是什么? 英语翻译 一列火车在平面的铁轨上行驶,由于遇到紧急情况,火车以速度v(t)=5-t+55/(1+t)紧急刹车至停止.求 (1一列火车在平面的铁轨上行驶,由于遇到紧急情况,火车以速度v(t)=5-t+55/(1+t)紧急刹 一道中考物理题如图16所示,甲是小艳利用某透镜观察到的小明眼睛的像;乙是小亮利用某眼镜观察到的课本上“物理”字的像.关于上述两种情况中所观察到的像或用到的光学仪器,下列说法 Al的最高价氧化物与cl的最高价氧化物的水化物反应式急,请速回要离子方程式 =IF(ISNA(VLOOKUP($A$1,订单台帐!$A:$U,12,FALSE))," ",(VLOOKUP($A$1,订单台帐!$A:$U,12,FALSE)))详细的解释三个函数(IF,ISNA,VLOOKUP),它们各自的公式、意思及整体的意思.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘