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

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

深挖线下价值是当前婚恋交友网站获取盈利的突破点 15个最好的Bootstrap设计工具推荐 Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】 Webix 1.5发布:一个强大的JavaScript UI组件库 四大著名风投:在我们眼中只有技术革新 美女CEO谈AWS:是香水还是毒药 国外一学生发明新计算机系统,用微芯片代替硬盘 《近匠》第12期:Yeelink——智能硬件云服务 三星Galaxy S5:home键内置指纹识别传感器、5.25寸2K屏幕 Google发布Google Glass使用守则 三星将发布新款智能手表 搭载Tizen系统抛弃Android 从Camera360 V5版本发布,看现代相机应用趋势 索契冬奥会API:赛事的数据直播 为什么开源企业的开源大旗正在褪色 尘埃落定 腾讯确认投资大众点评,获20%股份 Unite China·2014:上千Unity开发者狂欢、五大精品课程全面开启 下载4万首歌曲仅需几秒——蓝色巨人IBM发布新传输技术 15核芯片+数据平台,Intel软硬兼备的Hadoop战略 Facebook以160亿美元收购50名员工、4.5亿月活跃用户的WhatsApp 2014年全美最吃香职业TOP100,程序员排第一 LinkedIn向所有用户开放博客发布平台 Google与Facebook的产品研发之道 小米海外扩张第一步 红米进军新加坡 Google I/O大会时间已定,Google Glass真的来了? 精英团队PK全能型数据科学家,拼的可不只是数量 专攻移动支付?PayPal将面向全球开放移动SDK CoconutKit:iOS开发必备的开源组件库 个人隐私是如何“泄漏”的:国内外互联网企业隐私策略对比 惠普2014年Q1财报:净利润同比增16% PC业务逆势好转 “阅后即焚”挖谷歌墙角,GAE技术大牛跳槽Snapchat 日800万访客、20万RPS网站的5个9可用性架构 Access 2000不识别{ts '2001-06-21 21:14:01.890000'}中的.890000,如何解决? 如何得到webbrower控件下载消息?(比如下载*.zip文件) 难题一条 MTS怎么只能生成*.pak 和*.dll,却不能生成Clients子目录及在客户端安装的*.exe COM组件安装! PB 的新问题,有性趣请进!!!! 新手,键值问题 这样的问题没人会????? 大家帮忙看个程序 ACCESS数据库的小问题。 怎样使自己的问题成为热点问题的绝招! 关于c++builder中scanline的应用 跨数据库查询,请教各位高手! 这样的问题也没人会????????????????? 如何使用QuickRep制作简单报表?不牵涉任何DataSet的 关于Transaction的问题 请问 ListCtrl Item里的 Checkbox 被点击时对应的消息是什么? 100分~~100分~~高分求购。。。我也‘倾家荡产求购优秀系统分析案例’(paste from yyzh)。。。100分~~ 全中文的用Rose做的实际项目的UML模型! 救命!!我的机器不能下载东西了,怎么回事?? 求教邮件编程问题,邮件客户端如何实现“在服务器端保留备份的功能“? ciscoworks 各位大哥大虾,VC下如何用ADO连SQL SERVER?(急) ShellExecute和CreateProcess有什么区别? 关于海量数据、最有效率的排序、硬盘缓冲与映射、专业数据库的讨论 如何用VB编启动是可以带参数的程序呢?(例如:我自定义了一种文件,双击用我的程序打开,程序自动会打开这个文档 昨天我过生日,今天分蛋糕给大家 请问哪有《java图形设计2Swing篇》可以下? 我要用一个数据库去实时访问另一个据库,我该怎么办 URLghj1976@csdn.net----别吓我,有请您老人家! 谁给我介绍一下sql server7.0教材的比较好的下载网站,我给他20分。 我都急死了,到搜索引擎里搜到的好几个站点都不能用,到底哪儿可以当到3DMAX? 谁有写的比较好的邮件收发程序? 一个微软证书的私钥问题 微软证书的私钥问题 求助,简单问题 男人最快乐的十个瞬间! solaris下装oracle8.1.6遇到jre环境问题 怎抹加分?我准备给别人加40分,可我最多只能加20,请问另外20分怎末加分,为此我可能已得罪了一些人了。 请教下载的问题 如何在运行时动态修改Quick Report的打印机设置? 怎样做一个接受拽拖的LISTBOS(例如,把资源管理器里的文件拖到上面,就自动增加一项 ,就是拖的文件名) 怎样才能隐藏在ctrl+atl+del中进程列表中的项目啊 用C写DLL 请问:airhorse(编程至尊宝),infopower3000的注册码可以用于商业目的吗? 结构化异常处理 linux下如何配置内置Mondem? red hat linux7.0下安装oracle8.1.6遇到问题 我是菜鸟,问一个关于类的问题 问题:TWebbrower中,InnerHtml和OuterHtml以及InnerText和OuterText之间的区别 (加急)我要傻了,快救命啊!高分求救!!(回答正确者尽管开口要分!) 试求代数式2x的平方+x-3的最小值,并求出当x取何值时,该代数式取到最小值, 已知x-1=根号3,求代数式(x+1)^2-4(x+1)+4的值 若根号2x+1+[y-2]²+ |z-1|=0,求代数式(xy)²的值 利用配方发求:当X取何事,代数式2X^2-4X+6有最小值,是多少?代数式有最大值吗?为什么? 已知x=根号2-1,求代数式x/x-2÷(2+x-4/2-x)的值 设x=1/根号3-2,y=1/根号3+2,求代数式X²﹢XY﹢y²/x﹢y的值 代数式2X的平方-4X+1的最小值为多少 当X=2-根号3时,求代数式(7+4根号3)X^2+(2+根号3)X+根号3的值? 已知x=2+根号3,y=2-根号3,求代数式[(x+y):(x-y)-(x-y):(x+y)]*(1:x²)-(1:y²) 的值代数式图片 说明代数式2x的平方-4x-1总大于x的平方-2x-4. 当x=根号3,求代数式(x-1)(2X-根号3)-x(2x-1)的值 当x=根号2007-1时,求代数式x²+2x+3 代数式根号下(X^2+4)+根号下[(12-X)^2+9]的最小值. 若x的平方+2x+1+根号(y+1)=0,则代数式根号(x-y)的平方的值是? 当X=根号5-1时候求代数式X²+2x-5的值 代数式根号(x平方+4)+根号[(12-x)平方+9]的最小值为多少?这个题目是刚开学初三的老师布置的~ 若y=√x-3-√6-3x+√(-2)^2,求代数式x-2分之y+三次根号(2x+y)的值. 已知a-b=3,a+b=根号7.求代数式a²+b²及ab的值 代数式根号下【(x-1)平方+1】+根号下【(x-2)平方+9】的最小值 当x=1+根号3时,求代数式(x^2-1)(x+1)/x^2-x÷(1 +x^2+1/2x)+x的值 当x=4-根号3时代数式x²-8x+19的值为 给出代数式根号下[(X+1)的平方+1]+根号下[(x-3)的平方+4]的几何意义,并求它的最小值 已知根号X加根号X分之一=3,求代数式X分之X平方+1 当x=(1+根号2011)/2,求代数式4x^3-2014x-2010的值 代数式根号x+根号(x-1)+根号(x-2)的最小值是 若代数式x-1分之根号x有意义,则实数x的取值范围是如题 已知x∧2-4x+1=0,则代数式根号下x+1/x+3的值为? 求证:代数式根号X+根号X—1+根号X—2 的最小值为根号2+1? 若代数式3次根号下x分之1在实数范围内有意义,则x的取值范围为—— 当X=根号3-1时 求代数式X²+2X-3的值 若x,y都是实数,且满足y>根号(1/2-x)+根号(x-1/2)+1,化简代数式1-x分之根号(x-1)的平方-(y-1)分之根号y平方-2+1. 若代数式根号x-3有意义,则实数x的取值范围是如题. 已知a=根号3+1,b=根号3-1求代数式a²b-ab²的值 若实数X,Y满足Y=根号下2X-1+(根号下1-2X)加三分之一求代数式X平方-2XY+Y平方 求使代数式根号1-x+根号1-2x分之1+2+x分之1有意义的条件 已知:a=3倍的根号2+2倍的根号3,b=3倍的根号2-2倍的根号3,求代数式a²b-ab²的值. 已知实数x、y满足|2x-y+1|+3根号3x-2y+4=0,求代数式[(x-y)/(x-2y)]/(x的平方-2y)/[(x的平方-y的平方)/x的已知实数x、y满足|2x-y+1|+3根号3x-2y+4=0,求代数式[(x-y)/(x-2y)]/(x的平方-2y)/[(x的平方-y的平方)/(x的 当x=根号2013-1时,求代数式x的平方+2x+2的值 已知x-1=根号3,求代数式(x+1)²-4(x+1)+4的值 若实数x,y满足y=根号2x-1+根号1-2x+1/3,求代数式x^2-2xy+y^2的值回答的能否详细些 已知代数式x的平方+y的平方+2根号2x-4y+根号42,这个代数式是否存在最大值或最小值 已知a=-根号7+3分之2,求代数式a³+5a²-4a-6的值 已知实数x满足根号x^2-2x-8+|x^2-5x+4|=0,求代数式根号x/1-x*根号x^2-1的值 已知x=(根号5-1)/2,求代数式x³+2x²-1的值 已知x-2=-根号3,求代数式(x+1)²-6(x+1)+9的值. 二次根式:当x=根号5-1时,求代数式x^2+5x-6的值.当x=根号5-1时,求代数式x^2+5x-6的值. 已知mn是方程x²+2√2+1=0的两根,则代数式根号下(m² +n²+3mn)的值为为什么答案不能得-3根号9不等于±3吗 已知x=根号5+根号2,y=根号5-根号2,求代数式x²-xy+y²的值 已知x=1/(2-根号3).求代数式根号(x的平方-8x+16)/(x的平方-5x+4)的值 若m为根号下2的小数部分,求代数式m²+m+根号下2的值. 求详细过程 若a,b分别表示6减根号5的整数部分和小数部分,求代数式2ab减b的平方的差要求有过程. 已知2倍根号2x-根号6=根号2x+2倍根号2,求代数式(7-4倍根号3)x05+(2-根号3)x+根3的值 已知m,n是有理数,关于x的方程x²+mx+n=0有一个根是根号5-2求m+n 已知x,y分别为8-根号11的整数部分和小数部分,求2xy-y的平方的值 当X取何值时,代数式2X平方减4X加6有最小值.为什么, 问一道题;已知x=2008-5称根号3求代数式x的平方-1/x方-2x=1÷【1=x=1/x-3】的值 已知x=根号下2011根号外再-1,求代数式x²+2x+5的值、 当X取何值时,代数式X的平方+2X+3取最小值,并求出最小值 已知X=根号2,则代数式x/(x-1)的值为多少 已知x=根号2015-1,求代数式x²+2x-2015的值
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn