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

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

CGI技术及其开发(一)-Delphi资料 COM/DCOM中如何传递数组-Delphi资料 COM与DCOM的区别与联系-Delphi资料 Cookie的建立使用-Delphi资料 Delphi 3中Cookie的建立使用 Delphi 中 串 行 通 信 的 实 现 Delphi4.0 开发WEBMAIL程序 Delphi4的Winsocket编程 Delphi4开发WEBMAIL程序 Delphi编写网络程序的安全措施 DELPHI 和 THE INTERNET Delphi开发Web Server程序如何返回图像 Delphi开发Web Server程序响应用户的输入 DELPHI与INTERNET(二) DELPHI与INTERNET(一) Delphi中串行通信的实现 Email 服务器的简单实现-Delphi资料 Internet编程技巧-Delphi资料 SMTP组件的使用方法-Delphi资料 Web Server程序开发环境的建立-Delphi资料 WEB数据库的开发-Delphi资料 Win32 行程通讯的观念与技术-Delphi资料 编程发送E-mail-Delphi资料 调用那个函数得到本机的IP-Delphi资料 动态改变/添加网络设置中的 TCP/IP 的 DNS 地址-Delphi资料 任何动态改变/添加网络设置中的 TCP/IP 的 DNS 地址-Delphi资料 如何在程序中动态取得Win98的网络邻居中的工作组及计算机名-Delphi资料 动态设置DNS地址-Delphi资料 读取IE收藏夹内网址的信息-Delphi资料 改网络计算机名-Delphi资料 关于WEB应用程序的打印组件开发初探-Delphi资料 请问unix下有没有类似于windows下的DLL的二进制代码存储文件机制?(当然不是javaBean) 关于语音控件CTTS1.0? 请教各位:问如何对变量zz='02'转换成16进制? flash 5。0哪里有下载 在vc中调用用vb写的com出错,为什么? 关于多态性的理解,对吗? 如何知道1个类是不是存在? ??请教:我的程序 help!help! 如何对程序执行动作放缓慢! 很小很小的问题!! 棘手问题??急急!!! 各位懂软件测试的朋友,请介绍一些资料给我,非常感谢! 菜鸟问个调试问题,别见笑! 请介绍一下学数据库应学什么开发工具更好些,除了sql语言? 请教一个关于TextArea区域中数据显示的问题 高分求以二进制方式打开文件 哪里能找到dialogic卡的VN协议? 求解:BC++3.1 or high编程在DOS下连接interbase server 高手快进!!!一个DataReport报表的异步操作问题( MYSQL的帮助文档哪里有下载?谢谢 求,谁有zip unzip的源代码 菜鸟的问题,送分来了! 有谁知道什么是SDD吗?请指教!!!!别吝惜呀!!^o^ 简单的右键弹出菜单问题…… 我想编一个pop3服务器,适用于windows iis,给点提示吧 编译SERVLET时老出现"...包 javax.servlet 不存在..." ? 请教关于 98中 Personal web Server的问题 辽宁4:0狂胜广东,爽丫!SB广东解说员居然说中国足球没戏了~~~~~~~~~~ 用APPLET做一个上传的东西可以吗???? "我的问题"栏中,只剩下未解决的了,已给分的为何都不见了? 在CSDN和大富翁都没人会答的简单OLE问题,唉! 我是shijie819有问题?? 各位高人,看看代码,不能输入汉字只能输入英文,问题在那里? 如何将编好的n个模块连接到一个工程 请教!关于listbox的列属性? Applet为什么能在JBuiler5中调试,而不能在浏览器中显示 SOS!谁有语音卡编程的经验和资料,恳请指教!给分的! 谁有用VC++中ODBC API 编写数据库的例子? sql server 有沒有邏輯型字段!!! 电娃娃领分!!!!---goldsun发 猛禽进来拿分. 谁有画线的函数源码,参数为两点坐标? 如何将xml中的数据转换成动态的数据图形显示啊 有谁可以讲讲有关KV3000的A盘..... 没有问题 请问斑竹:是不是以前的得分时间长了会没有了? 小弟向大哥大姐们请教VB数据库问题! 考研问题请教!!!! 这个问题和apache配置有关吧! 哪里有比较稳定而且空间大、速度快的主页空间? 关于探索月球奥秘的作文月球又称“月亮”.在望远镜发明之前,古代的人们只能在晴朗的夜晚,用眼睛仰望皎洁的明月.看到月亮表面有明有暗,形状奇特,于是人们就编出如嫦娥奔月、吴刚伐桂 作文:月球探秘要求:600字,要有说明,记叙,初一的.主题是尝试破解自然奥秘. 爸爸去哪观后感700字作文 探索月球奥秘 作文 探索月亮奥秘内容一:关于月亮的神话传说内容二:关于月亮的诗歌内容三:赏月佳对要具体,三个内容都要,好的话再加15分当都不错时,字数多的采纳 和谐主题作文素材以下方面给和谐下个定义新颖的立意新颖的事例 名人名言 比喻论证 精彩论文结构 探索月球奥秘 作文500多字探索月球奥秘 谢 谢 月球的奥秘作文 作文素材 和谐的事例 300字作文 探索月球奥秘 探究月球奥秘关于月球奥秘的! 请给一些有关绿色环保和谐的作文材料急,两天以内 庆国庆作文1200字我都快愁死了~1 关于月球奥秘的作文,500字左右.急. 能直接写入文章的素材, 求 庆国庆 作文 1000字左右 求以和谐为题作文别出心裁者为上(快的有奖) 作文《我心中的曹操》300字 庆国庆、颂祖国的作文有吗 就读一篇课外文章,写一篇读后感400字以上. 谁能给我关于三国曹操的作文 300字 作文《过年》1000字 写一篇关于曹操性格的文章1000字的 品读曹操的作文100字左右 600字作文:《秘密》1、字词搭桥写童话《秘密》2、提供三个词语:小兔———泪水———彩虹3、想象丰富合理,内容具体,情感真,语句通顺,有一定的条理,字数600字左右. 以《我心目中的曹操》写一篇作文议论性的 如何评价曹操 300字小论文 600字作文 我心里的小秘密 我要一篇以《和谐》为题的作文 我眼中的曹操300字作文要怎么写这作文…写个意思就行了…300字就好了…谢谢… 500字关于书的作文 作文以“我心中的和谐”为题和谐,是一个精彩的瞬间,一个温馨的情景,一个甜蜜的镜头;和谐,是一首悦耳动听的乐曲,一幅美妙绝伦的图画,一处如诗如画的风景;和谐,是一个幸福美满的家庭 中秋节作文 800字 关于书的事 作文 500字不要抄袭! 和谐发展为题的作文中秋节到了,台湾的同胞也在看月亮把,以“和谐、发展”写一篇作文.大哥大姐可怜可怜我把 有关曹操200字的小论文,注意要有他的事例,并且加以评论,速求!速求!回答问题的仁兄注意了,要的事例不必太详细,但要突出曹操同志“伟大滴精神”,懂不? 关于 “书” 的 优秀作文500字、 写中秋节的作文800字 对曹操的评价,200字左右 关于 “书” 的 写事 作文500字题目有点难……又是关于书的,又是写事的。 以和谐的竞争为题 800字 以《我眼中的曹操》为话题200字作文知道的说下,我会给你分的、 作文以成长·快乐·和谐为主题 急,中秋节作文800字,不要重复的 以“发现中国”为话题的作文素材``是素材哦``给个灵感``我会自己写``5个左右的素材``一定要小角度,不要汶川地震啊``奥运之类的``这些坚决杜绝··我知道很难,下面是作文要求:内容可选取 安全,和谐为主题的作文要1千字以上 写一篇关于希腊故事读后感的作文,200字左右+5悬赏财富 惊喜的发现作文素材 以 和谐 为话题的作文不要太长 800字左右就OK1 以“科学发展 和谐发展”为主题的作文 写一篇关于希腊故事读后感的作文,400字左右!急! 以和谐与发展为话题的作文话题作文行就可,适合现如今的国情,不要老掉牙的!创新作文 求一篇 “曹操,我想对你说”的作文600字左右 有关读后感的作文(600至700字)我星期五晚上要用 以“和谐”为话题写的作文要好的 以《我眼中的诸葛亮(曹操)》为题,做一篇2000字的文章 关于 建国60周年的历史论文 1000字谈一些这过去60年的历史,例如国家经历了一些什么困难,谈一谈经验,总结教训. 帮忙写篇初一作文(探索月球奥秘) 认识曹操 作文800字最好是初一水平啦,快啊,要交了, 求一篇读后感作文,700字的,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn