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

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

又见真人CS:13th Lab推出移动FPS对战平台 前瞻、教育、创业:Maker Faire演讲嘉宾揭晓 提高API采用率的六大方法 一周热点:以咖啡店为例演示Web应用程序扩展 中国云计算大会PPT集萃(四):数据安全与实际应用挑战 CDN前景光明,SDN发展的驱动力源于对产业的颠覆 Android、WP双系统若要发展 难题不断 即将于下周召开的微软Build 2014六个愿望清单 【独家专访】腾讯陈磊:你不知道腾讯对开源有多爱 地下数据交易网站Rescator被黑,疑似Target报复 Spark独门秘籍:打造结构一体化、功能多元化的高效数据流水线 【走进支付宝】重磅嘉宾!历届“走进企业”回顾 【OSTC讲师专访】腾讯TDW项目:开源的分布式数据仓库 ID爆发的物联网时代,我们该如何管理手中的数百个账户 取代Google Maps?苹果大幅优化Apple Maps用户体验 中交兴路系统架构师杨晓明:Hadoop+Storm+ HBase…,打造交通行业创新型服务 雨果&#183;巴拉的第二春:我与小米的那些事儿 为什么Android Wear能统领智能手表领域? LinkedIn缘何抛弃Ruby,转投NodeJS怀抱 【OSTC讲师专访】九秒社团李明:开源对游戏产业的渗透与帮助 IBM 2014中国论坛:挖掘新互联网时代下“智慧企业”的发展之路 Facebook工程部副总裁Cory Ondrejka谈企业在早期所遇到的管理瓶颈 小团队管理工具选择:不需要大而全 《近匠》聚合CEO左磊:基础数据免费,API开放 IDC:HTML5与原生应用之争还将长存 不甘称臣,Google誓要击败Amazon 【OSTC讲师专访】腾讯追风(QcloudMna):开源移动加速SDK Google Go:一门为云而生的编程语言 3月26日:没有Larry Page,就没有今天的Google Hortonworks再获1亿美元融资,Hadoop领域三足鼎立 Intel收购Basis Science,欲拓展可穿戴设备市场 哪有ADODB的使用说明? 两个表之间的操作 鼠标哪里去了??/ 倒分 一个更新远程数据库的问题 · 一个更新远程数据库的问题 有没有JBuilder高手请过来看看 是不是有木马?几种杀木马程序多说没? 绝对真实,是中国人的都来看看 一个更新远程数据库的问题 csdn的精华区在哪里?怎么进去看? 一段C语言的程序,最后却跟了这么一段,有没有哪位高手知道这是干什么用的? 求助!!!!! 怎样提高编程水平阿?刚来请指教 下载的potoshop插件怎么安装? Move2008 J2ME SDK 发布,请下载 仅仅有OA的源代码,能做成一个可应用的商业软件吗?欢迎大家讨论 如何将OLE中的EXCEL设为指定的大小,高手救命 linux下如何安装jre? 关于打开文件的问题 我的程序怎么一放到其它机器 上就执行不了了 OLE保存时能不能单击实现??? 小问题,进者有分 一个关于sendmessage的问题。 救命啊,FTP的客户端程序 linux下如何安装jre? 怎么使验证失效? 如何实现字符串扫描? 我从来没用过C#,也不会,不过这个关于其运行的问题我确想先知道! 一个老问题! 今天我给一个男人骚扰了一回 有个问题,朋友们请进.sos 一个非常简单的问题 TListItem的Data属性(void)如何使用呀,如何读出它的值呢? bmp to ico 今天看到一个怪现象~! 软件过来人为小弟指点~~ bmp to ico 如何打开控制面板 高分求教,我爱上了兄弟的女朋友,我该怎么办?(100分) 求助:在首次适应算法和最佳适应算法中,分区分配和分区回收的c语言实现。 同在一个城市,呼吸着同样的空气,都为这老板的几块大洋打拼,蓦然回首才知道已经几年了,也该为自已的未来思考一下了。。。 请问有关两个宏 bmp to ico 硬盘无法访问的问题,急!!!估计是被黑了 ISA2000中的问题,特急,在线求助 处理窗口关闭时的动作? 高分求教,我爱上了兄弟的女朋友,我该怎么办? (100分) 请问不通过Image控件如何用直接用DC来显示一个BMP?? 请问现在数据库开发技术有哪些?大致情况? 为什么第二象限sin大于0 lu6200怎么进入recovery 为什么exo的e不发音 已知α 为第二象限角,sinα+cosα大于0,则 cos2α怎么判断正负 LG lu6200无法手动进入recovery,也无法刷各种系统,用卓大师也无法进入recovery好吧,详细说明下,手机音量上加电源键,会出现download mode 的画面(所以我通过电脑硬刷了4.0的系统,不过可惜是官方版 已知如图ab=ac,角abd=角acd,求证ad平分角bac可添辅助线做就是连接bc 北京地铁电动扶梯上的玻璃半球是干嘛用的? Can you d____ the picture in English 矩形 (8 22:37:6)在矩形ABCD中,对角线AC,BD相交于点O ,在BC上取BE=BO,连接AE,OE,若角BOE=75,求角CAE的度数? 求白话翻译 我们的天空 There is "h" in the word •'honest",but it is not pronounced.A)/ B)a C)an D) the 他非常喜欢住在这儿,用英语怎么说 “你是大混蛋”这样翻译吗?You is big bastard , 如图1,在平面直角坐标系中,等腰Rt△AOB的斜边OB在x轴上,直线y=3x-4经过等腰Rt△AOB的直角顶点A,交y轴于C点,双曲线y=kx 也经过A点.(1)求点A坐标;(2)求k的值;(3)若点P为x正半轴上一动点, 王先生喜欢住在乡村,因为乡村很安静.用英语怎么说 英语You a bastard 有这样的说法吗?还是you are a bastard? 接地气是什么意思? 一条导线的电阻R 对折分成等长的两段之后,把这两段并联起来使用,这时电阻是? Oops..We couldn't detect a face in the photo.Plese try a different one. 有没有喜欢EXO的粉,本人聘EXO家族 哪几个国家拥有绝对主权 word is that是什么意思如题. 当角a=20度,角b=30度,sin(a+b),是否=sin(20+30),即sin50是吗? “我要参观钟楼”用英语怎么翻译 一个多边形的周长等于158cm,所有各边的长成等差数列,最大边长等于44cm,公差等于3cm,求多边形的边数? EXO《XO XO》出来后,都参加了什么综艺节目?求大神们知我声, 一个国家对自己海洋的专属经济区拥有主权吗? He is a fraid中文意思 如图在平面直角坐标系中,等腰Rt△AOB的斜边OB在x轴上,直线y=3x-4进过如图1,在平面直角坐标系中,等腰Rt△AOB的斜边OB在x轴上,直线y=3x-4经过等腰Rt△AOB的直角顶点A,交y轴于C点,双曲线y=k x 也经过A 同心协力的意思 英语句子 the catcher in the rye里的我正在读the catchers in the rye.文中有好多and all怎么解释?he read it anyway,though .这句话怎么解释 电力设备及仪表质检中心质量检验合格证怎么翻译 同心协力的意思是什么 急求5个句子高中英语作文 in the future要有以下几点transportcommunicatinghouse 在三角形中,角A、B、C所对的边分别是a、b、c,若sin平方 B+sin平方 C=sin平方 A+sinBsinC且向量AC*向量AB=4,求三角形ABC的面积S 同心协力的协意思 角α的终边上有一点(-a,2a)(a<0),则sinα等于多少 The opposite word of "beautiful"is( )A.beauty B.beautifully C.ugly D.nice 在△ABC中,角A,B,C的对边分别为a,b,c,且sin^2B+sin^2C+1/2cos2A=1/2+sinBsinC.(1)求角A;(2)若AC向量*AB向量=4求△ABC的面积及周长的最小值 角0的终边上有一点(a,2a),求sin0的值. the pettern is beautiful甚么意思 英语翻译This article describes the current costing and pricing methodology from both a distributor and a user perspective,before briefly discussing how these might develop as regulatory emphasis begins to change from one that is asset based to a 胆子大的英文怎么表达啊? 谁是中国第一个总统? G2进入不了recovery怎么办? 河中石兽怎么背 lu6200没有recovery,刷不了recovery,进不了recovery,刷不了机!使用“音量上+电源”,在停顿的“LTE”,无论是按音量上,还是按音量下,都显示这个图:(PS:已经用lg-upgrade.exe搞了这个LU620166_00.kdz进去了.) HTC G2手机如何进入Recovery模式 1991年1元硬币正面上方是:中国共产党成立七十周年,中间字样是:第一次全国代表大会1921,背面是国徽. lg lu6200无法进入recoveryLG lu6200手机关机状态下按音量-和电源键 再按两次电源键后卡在LG图标的画面,不能进入Recovery. LG G2怎么进入Recovery模式 已知sin(π+θ) 谈谈笛福小说《鲁滨逊漂流记》为什么吸引我 G2刷recovery、还有什么方法呢?如题 为什么 我刷了大眼帮主的G2recovery 很多次了 刚刚刷了 机器人是站着 后面就又趟下了了 ====在手机用移动叔叔工具更新recovery.img 、电脑用 cmd刷入recovery.img… θ是第二象限的角,则cos(sinθ)大于小于还是等于0? LG LU6200怎么刷入第三方中文recovery 判断奇偶性 y=2-x平方 已知a为第二象限角,则四个数中必大于零的是(多选题) A.sin(cos a) B.sin(sin a) C.cos(sin a)D.cos(cos a) 笛福的小说到底是《鲁宾逊漂流记》还是《鲁滨逊漂流记》啊?到底是哪个宾(滨)啊 帮忙做一下这个完形填空.准确一点. 日媒:中国和日本被美国列入“重点监视台向美购阿帕奇战机抵台组装测试(图)台向美购阿帕奇战机组装过程曝光(组图克里急赴中东安抚盟友沙特中国梦惠及非洲英超市香蕉出剧毒蜘蛛 全家躲出三晚消美海军一教练机坠毁 两飞行员受伤送医曝孙杨所载女子为新女友 已与大5岁空独家:小沙丘 大文章——本网记者探访韩国总统朴槿惠赴英访问 重点商讨经济美一T-45C“苍鹰”教练机坠毁 机叙政府不参加日内瓦会议 称不会参与交日本拟造两艘宙斯盾护卫舰 将搭载最新美媒:28%美国人视中国为全球头号经马来西亚保安现状存隐患 保安员过半是日本拟造两艘宙斯盾护卫舰 将搭载最新美媒:28%美国人视中国为全球头号经克里称沙特是中东领导者 两国须维持正克里称沙特是中东领导者 两国须维持正诺基亚Lumia 929最新真机谍照巴基斯坦总理谢里夫:无意义的暴力换不不会改变好医生阴凯 33年如一日负荆请罪左兜业主,右兜装修公司新闻点点评中国球员屈居亚军19名嫌疑人被捕中学生写爷爷奶奶的故事小煤炉销售一直没离市中心多想会说话 谁来帮帮她干代驾戒了他的赌瘾“舌2”臊子面受追捧日本岩手县一对夫妇进山采野菜遭熊袭击美国一亚裔男子疑因醉酒进错家门遭枪杀火爆!落难明星扎堆综艺节目慕田峪长城将实施整体保护为他打球飘零的日子何时结束分手奇招中国货船在墨西哥湾沉没
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘