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

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

创业失败的七个原因及解决之道 集结号:最受开发者欢迎的跨平台游戏引擎 Cocos2d-x v3.0正式版本发布!优化C++、Lua、JavaScript接口 定价99元首发1万台 360安全路由器启动预约 AMD新产品线曝光 首次实现X86与ARM针脚融合 IT界最难以替代的9个角色 《近匠》英特尔&#174; XDK:从开发、测试到部署,一站式HTML5开发工具 手游云测工具TestBird:测试走入垂直细分领域 阿里巴巴赴美IPO的种种及马云内部邮件全文 盘点EMC World 2014三大看点 2014年Q1:智能手机总销量下滑,WP同比反增119% 着眼无人驾驶技术 英特尔投资日本ZMP公司 移动云服务UCloud快速扩张 成立北京分公司 精准推送 个推推出2.0产品“Smart Push” 从张小龙的七大价值观说开去 2014高德LBS应用大赛正式启动 助力打造生态圈 专访永洪科技CEO何春涛:管理者的炼成及国内大数据公司的挑战 R语言如何发展?商业支持或许可行 专访InMobi CEO Naveen Tewari:Banner广告已经OUT 效力苹果18年的资深高管Katie Cotton将退休 主打“全、新、独、准”,华为推出游戏中心平台 阿里云计算出海挑战亚马逊 首站香港及东南亚 TIOBE 2014年5月编程语言排行榜:Adobe ActionScript挤进Top20 秒杀iPad Mini?微软或将下月发布Surface Mini 大道手游:详解应用内购买的定价趋势与技巧 与英特尔软硬合作,Cloudera将在中国建立业务机构 准备迎接第一个量子计算软件公司吧! 搜狗搜索发布新LOGO和移动App 正全面入驻腾讯各条产品线 做好扁平化设计-视觉篇 关于敏捷研发的跨界反思 《近匠》雨血,一个“独立游戏人”的反思 ●●∑∑●●∑∑测量窗体‰‰▲▲∑∑●●谢谢 VC的编译器到底怎么回事,老是说我少了分号。我都快气死了 棘手的问题! com高手请进!!!!急 硬盘分区 我的VB烦死了 请教一个关于数据库表格备份和bcp命令的问题,急!!! 请问学习JAVA语言用什么工具最小又最好?比如说学习C语言就用TC就OK了! 关于汉诺塔升级版。 急!为什么临时表空间总是不够? 如何判断一个线程已经处于死循环或不响应(即系统CPU占用率高达98%以上)?求助!!! 用CPictureEx类加载gif动画的疑难问题,给分50 请问各位高手,java项目经验主要包含什么东西? 如何判断一个线程已经处于死循环或不响应(即系统CPU占用率高达98%以上)?求助!!! 救我啊!想在局域网的网关机上监控其他机器发出的http请求 怎样快速选取checkbox 请问怎么把几个txt文件合并成一个文件,急!!!!在线等待 关于在广州建立《江西老乡在广州的备忘录》倡议书! 关于程序编译的问题!!!! cast问题 一个简单问题? 怎样删除多条记录,象邮件系统中的删除邮件的操作? Bof或Eof有一个为真,或者当前记录已被删除,请问MDAC2.5哪有下载? 请教:oracle 7.4.3 触发器的错误处理 .htm传递参数! 一个比较菜的问题,我的VB6中窗体的name属性没有,请问怎么加入. 简单sql语句求助!!! 如何在vc++中获得当前用户的用户名? 為什麼在我機器上建立與其他機器的oracle連接的bde出錯???連sql server都沒問題,破oracle真亂!!!!! 真气人 急,用TADOTable控件怎么对字段进行查询?请举例说明!谢谢! 用fireworks 4.0制作动画,请问怎么样用一张图片做背景? 在用VC调DLL时报错,error C2171: '*' : illegal on operands of type 'int (__stdcall *)(char *,char [])'怎么办? 一个打包的问题 在表格式的数据窗口中显示image的问题??欢迎讨论,拒绝灌水! 128MB内存跑BCB6好像有点那个? 请问有人知道哪儿有打印条码的源程序吗? 有关INSERT 插入数据到ACCESS 数据库,为什么出错,急,急,急,菜鸟请教,马上给分 vb.Net的较大的Project编译时,经常出现某些.resources文件找不到,为什么?气死人了! 我很菜,望高手帮忙! 小毛头毕业分在工程部,望个为师兄指点应该注意些什么? Java Applet 中变量的问题请教. 这儿看看! 请帮忙看看这是怎么回事? TRIGGER 请问热心人帮帮我这个热心的学生. 如何安装acm控件 到底应该先看VC++技术内姆还是先看MFC深入浅出? 请问如何使打开的窗口在屏幕正中间? 怎样产生一个全局唯一标识ID? 双套超级查询器!!!上传完毕!!! 【小石潭记】全文翻译与个别注释 “法布尔老人让我了解了昆虫世界,而昆虫则令我永远记住了法布尔老人”怎样理解这 有一个圆柱形的桶(有盖),它的底面积与侧面积正好相等,如果这个圆柱的底面积不变,高增加3厘米,它的表面积就增加113.04cm²,求原来圆柱体的表面积. 英语翻译小石潭记整篇翻译和字词翻译 一个圆柱铁桶高6.28分米,它的侧面展开后是一个正方形,这个圆柱的表面积是多少 有一个圆柱形的桶,它的底面积与侧面积相等,底面不变,高增加3厘米,表面积增加1130.4求它的面积. 曲线ρ=a^2cosθ所围成的图形的面积为 一堆西瓜一半的一半一半的一半,一半是几个西瓜? 教室前面的墙壁长6米宽3米,墙上有一块黑板面积是3平方米现在要粉刷这面墙壁要粉刷的面积是多少不用方程 印刷厂装订一批新书,计划每天装订25000册,3天可装订完..实际每天比计划多装订20%,这样多少天可以装订完 学校礼堂有8个圆柱形柱子,柱子的底面周长2.512米,柱子高5米,油漆这些柱子的表面,每立方米需油漆0.1千克,共需油漆多少千克?(得数保留一位小数) 一堆西瓜一半的一半一半比一半的一半少半个是多少个?提示(四个4) 红心印刷厂装订一批新书,原计划每天装订3500本,30天完成,结果提前5天完成,每天的工作效率提高了百分之几 求曲线r=1,r=2cosθ围城的公共部分图形的面积不化成直角坐标 直接用极坐标的定积分求怎么求? 进口红外夜视望远镜哪个品牌好,夜视清晰度高 有哪些英语的用法? 某大礼堂有6根圆柱形柱子,每根柱子高10米,周长2.512米,要全部涂上油漆,如果按每平方米的油漆费为70元 英语翻译小石潭记 注释 翻译 段意 总结 练习记承天寺夜游和治水必躬亲 建造一个容积为16立方米,深为4米得长方体无盖水池,如果池底的造价为每平方米110元建造一个容积为16立方米,深为4米得长方体无盖水池,如果池底的造价为每平方米110元,池壁的造价为每平方 一种饮料是由果汁与水按1:7的质量比调制而成的.5.6kg的饮料中,含果汁和水各多少千克?急急急!快点啊急用! 一个圆柱形铁桶的侧面积是50.24平方厘米,高和底面半径相等,这个铁桶的表面积是多少? “果汁的质量是牛奶质量的4分之3,牛奶重240克.”在前面的描述中,()是单位“1”,求果汁的质量也就是求()克的()分之()是多少,算式是().只说算式就OK了 学校大礼堂有四根长方形的水泥柱,已知底面边长是0.5米的正方形,水泥柱高6米若在柱子的四周贴上边长为0.25米的正方形瓷砖,贴这四根柱子至少要多少块瓷砖?3点钟之前一定要有答案哦! 一个空瓶的质量为0.5千克,装满水后总质量为1.3千克,装满某种油后总质量为1.14千克求这种油的密度 果汁的质量是牛奶质量的4分之3,牛奶重240克.在前面的描述中,()是单位“1”,求果汁的质量也就是求()“果汁的质量是牛奶质量的4分之3,牛奶重240克.”在前面的描述中,()是单位“1”, 一个展览厅中间有4根柱子,底边长5dm,高6米的正方体,要给这些柱子漆油漆,漆油漆的表面积是多少平方米 什么是判别钢材塑性变形能力和钢材质量的综合指标 某工厂建造一无盖长方体贮水池,其容器为4800m3深度为3米,池底每1m3造价150元,池壁每1m3造价120元,问怎问怎样才能设计水池使造价最低,最低总造价为? 好听的诗额..做了5个玩意..我想每个用一句诗贴上..最好来首正好是5句话的古诗..或者5句好听的古诗... 一个空瓶,质量是0.5千克,装满水后的总质量为1.30签个,装满某种液体后的总质量是1.14千克,则这种液体密 建筑一个容积为8000立方米,深为6米的长方体贮水池,池壁每平方米的造价为a元,池底每平方米的造价为2a元,把总价y元表示为底的一边长x米的函数,求函数解析式,指出定义域 小石潭记原文+注释+翻译 求比较好听的词语,比如无极,苍穹…并注上意思, 建造一个长方体无盖贮水池,其容积为4800m∧3,深为3m,如果池底与池壁每1m∧2的造价分别为150元与120元,问水池底面的边长分别为多少时,建水池的造价最低,最低价是多少 小石潭记原文译文注释 有什么好听的词语 r=acosθ 和r=asinθ(a>0) 所围图形的公共部分的面积.标答是a^2(π-2)/8.怎么算?此为高等数学定积分应用的题目.我对极坐标很糊涂的~ 有一个圆柱形油桶(有盖),它的底面积与侧面积正好相等,如果底面积不变高增加3厘米他的表面积就增加1130.4平方厘米,求这个圆柱的表面积. 好听的句子!要女生的、、、不要太伤感、、、带些符号更好、、、、 求椭圆x=acosθ,y=asinθ所围成图形的面积A 有没有好听优美的诗歌要新 求一句好听的句子求 求由x=acos^2t,y=asin^2t所围成的图形的面积 学校连接教学楼之间的走廊中有16根混譺土,高6米,底面直径6分米.给这些柱子刷上油漆,油漆面的面积是()平方米.如果每千克油漆可以粉刷4平方米,一共需要油漆()千克 一篇电脑的自述的作文,最好要有拟人手法,急. 脑筋急转弯一堆西瓜一半的一半的一半,比一半的一半少半个西瓜,这堆西瓜多少个?提示4个4 给一个底面直径为2米,高为15分米的圆柱形柱子上油漆,油漆面积是多少平方米 抽捡两箱饮料 每箱24瓶 其中有2瓶不合格 这些饮料的合格率是多少 一堆西瓜,一半的一半一半的比一半的一半少半个,这堆西瓜有多少个?(脑筋急转弯及生肖)生肖后面或前面是加什么字比较合适?如(呗、了、是、啦、哦) 小石潭记(原文+译文) 工商部门抽查酱油的产品质量,共抽查了120箱,合格率为百分之95.有多少箱不合格? 一堆西瓜,一半的一半的一半的一半少半个,请问这堆西瓜有多少个?脑筋急转弯 大厅内有5根底面直径是0.8米,高是12米得圆柱形柱子,要给它们涂油漆,涂油漆的面积是多少平方米?最晚13:00之前给我啊!小妹在此谢过各位英雄好汉了啊! 廷可以加那些部首呢?并组词 一个西瓜切三刀,最少分几块?不是脑筋急转弯RT练习册答案是写3块,我没想出来为什么 是最少!大家注意阿…… 英语翻译如鸣佩环怎么翻译?作者是谁?哪代的? 英语作文,一位外国朋友到你家做客,请你选择一周内的任意一天介绍你的学校生活.可适当发挥 60字左右如文中须提到姓名,可自拟一个英文名字 小石潭记翻译和讲解 {小石潭记}中的为翻译成啥?急 怎么写关于朋友一天生活的英语作文100字
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘