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

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

C#取得Windows服务列表 C#编程自动安装Windows服务 C#安装/删除 .NET Windows服务 C#启动、停止、重启Windows服务 jQuery实现Ajax提交form表单的简单方法 字符串String与枚举Enum之间的转换[C#] Javascript统计DOM元素里文字的行数 C#从Web网站下载文件 C#得到区域名称列表 C#合并多个PrintDocument WpWidgetLibrary - Windows Phone的HTML部件库(Widgets) 让你不再害怕C语言指针 C语言概述-C语言教程 Turbo C 2.0集成开发环境的使用(上)-C语言教程 Turbo C 2.0集成开发环境的使用(下)-C语言教程 程序的灵魂—算法-C语言教程 数据类型、运算符与表达式(上)-C语言教程 数据类型、运算符与表达式(下)-C语言教程 最简单的C语言顺序程序设计-C语言教程 分支结构程序-C语言教程 循环控制-C语言教程 数值数组-C语言教程 字符数组-C语言教程 函数(上)-C语言教程 函数(下)-C语言教程 预处理命令-C语言教程 C语言指针(上)-C语言教程 C语言指针(下)-C语言教程 结构体与共用体-C语言教程 位运算-C语言教程 文件处理-C语言教程 高手请进!!如何实现SQLserver和DBASE数据库时时更新? 急!!!! oracle登陆问题,在线等待。 人啊,认识你自己 (zt) 微软件专家问你下:如何在Exchange Event Sink 中挂钩我的自定义事件处理程序?谢了!急! MSComm实现传口通信的问题, 如何为WORD文件加密码保护? 那里有API for PB的资料??! 问一个关于Direct8编程的问题! 哪有PB7.0的安装文件? 是读软件工程硕士还是去当程序员? 用语法新增一个字段时,怎样将它加成第一个字段? 请问如何学COM,有没有什么好学习方法和建议? 有兴趣的来看看,来者有分 weblogic61中发布问题--高分相送 怎么在基于对话框的程序中加入一幅bmp作为底图? 不是吧,是不是没人会呀,偶问的最基础的也没人解决!! 请问软件工程硕士何时报名? 是读软件工程硕士还是去当程序员? "未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。"是什么错??急急急 XP 能够访问2000,2000不能访问XP,怎么办? jboss如何设定bean自动更新 各位,谁用过动态域名一类的软件,推荐一个好用的.速度要快的.交点钱没关系的。up给分 请较文件的拖放的问题?还望大家指教! 我是一个新手!请你们帮忙! 请问软件工程硕士何时报名? 如何实现仿照FLASH当中的,将字符旋转方向? 是读软件工程硕士还是去当程序员? 在VFP中如果把报表加入到菜单中? WinCE支持I&sup2;C总线吗?请高手赐教。 有高手吗???帮忙啊!!! 开发Midas数据库应用程序,哪些软件需要购买使用许可?价格? 写一个Word阅读器 VC6.0编译98DDK中USBVIEW例子,每个C文件末尾都有Fatal Error 是读软件工程硕士还是去当程序员? 在VB里用ADO对像来更新ACCESS数据库时出现"所有记录中均未找到搜索关键字。"错误!如何解决啊.. 怎么看懂别人的程序? 如何修改软件默认的安装路径。 是读软件工程硕士还是去当程序员? WinCE支持I2C总线吗?谁有资料 有没有深层次的c语言书啊?(50分) 请问dbgrid对应的数据表的某个字段为0/1,可以把其cell显示为checkbox? 什么是3D加速卡? 请教NotesFactory问题,那里有资料 developer2000的疑惑 一个小问题,请给我看看! 是读软件工程硕士还是去当程序员? 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 紧急求助:关于打印的问题 如何用C#在ASP.net中对数据库进行查询? 网络打印问题 某长途汽车客运公司规定旅客每人最多可携带30千克行李,超过部分每千克付行李费0.5元,需要0.5元的行李票某长途汽车客运公司规定旅客每人最多可携带30千克行李,超过部分每千克付行李费0.5 在三个相同的容器中分别盛有甲、乙、丙三种液体,将三个完全相同的铜球分别沉入容器底部,当铜球静止时,容器底受到铜球的压力大小关系是F甲>F乙>F丙.铜球所受浮力的大小关系为_____.3种液 壳聚糖盐酸盐的PH值多少啊? 什么是多元宇宙理论?是否是宇宙之间具有不相干性? 爱惠浦H100净水器烧开水产生的白色沉淀如何去除?我家最近买了爱惠浦H100净水器,烧开水后也存在大量白色沉淀,后打电话给经销商建议PP滤芯换成树脂滤芯,再说树脂滤芯通过钙镁交换不是产 ph=8的盐酸盐与烧碱反应生成什么?500克的 盐酸盐溶液ph=8.加入200克烧碱溶液后.怎样才能保持ph=8值不变 为未来宇宙航行奠定理论基础的科学家是谁? 净水器能解决烧开水产生的白色沉淀问题吗?白色沉淀是什么,净水的原理是什么,我家是农村的,水质特别不好,喝着一股酸涩,但是烧开了就会没有这种味道,不过的烧水后会会有白色沉淀产生, 当有毒化学物溢出时该干嘛? 某长途汽车客运公司规定旅客每人最多可携带30千克行李,超过部分每千克付行李费0.5元,一名旅客共付了行李费5元,则他携带的行李有多重? 净水器烧出来的开水里有很多白色粉末状水垢怎么办? 空气除湿机哪里有卖的? 科学家因为传统观念而做出错误判断的例子;除开恩格斯与鸭嘴兽的例子. 如图4所示,在三个相同的容器中分别盛有甲、乙、丙三种液体,将三个完全相同的铜球分别沉入容器底部,当铜球静止时,容器底受到铜球的压力大小关系是F甲>F乙>F丙,则液体密度相比较,正确的 你好 你能设计除湿机吗? 科学家对水组成解释的错误水分子?伟大的科学家说过,水是有两个氢分子,一个水分子组成的,可我拿菜刀在铁桶里劈了半天(前提是不把水洒在外面),也没把氢原子和氧原子分开啊?好处大大 生土豆汁有毒吗? 长沙什么地方有空气除湿机卖 鸡精粉炒菜会好吃吗 鸡精粉和鸡精同时用会多吗 可不可以用在Cacl2熔融盐中电解氧化钙制取钙单质? 放置四小时的豆浆有毒吗 就现阶段来说相对论和量子力学是相互独立,无法相互解释的吗 什么和氧化钙反应生成炭单质 喝放有白糖的豆汁好吗?有没有毒? 鸡精鸡精鸡精现在定期的,哪只鸡精好. 氧化钙能还原成钙单质吗? 半径是8cm,直径(),周长(),面积()r(),d(10)dm,C()dm,S()dm 滴鸡精 的 做法传统型滴鸡精的做法~ 不是太太乐鸡精那个鸡精~ 求详细做法~ 越详细越好~ 视答案加分奖励~ 碳单质能和氧化钙反应吗? 用吸管吸密闭的塑料杯中的豆浆或酸奶时,塑料杯变瘪了,此现象证明了什么? 如果实验证明,酵母菌在细胞质中把1mol葡萄糖分解为2mol丙酮酸时净生成2molATP,而在线粒体内把2mol丙酮酸完全氧化分解为二氧化碳和水的过程中产生了28或30molATP.那么,酵母菌有氧呼吸产生的ATP PE-RT地热管在室外存放的温度是多少(急) 一个圆的半径是2cm,它的周长是多少 最早提出电磁感应理论的是___国科学家____ 红外 2360cm-1应该为什么基团的峰 1、三个完全相同的圆柱形容器分别盛有甲、乙、丙三种不同的液体,放在水平桌面上,它们对桌面的压强相等,将铜、铁、铝三个质量相等的实心金属球分别按序浸没在甲、(P铜>P铁>P铝)乙、 我国科学家( )在深入研究我国地质结构的基础上,提出了“( )的理论.理论在建国后成了我国第一座大油田( ) 塑料杯可以盛热豆浆吗?图漂亮,买了个没有牌子的塑料杯,质量摸起来也还行,下面的P5标志那些都有?但是总觉得不够放心,为了方便带豆浆上班喝,大家推荐推荐用什么盛好?像乐扣和特白惠有毒 三个完全相同的圆柱形容器内分别盛有甲、乙、丙三种不同液体(p甲>p乙>p丙),放在水平桌面上,它们对桌面的压强相等.将铝、铁、铜三个质量相等的实心金属球分别按序浸没在甲、乙、丙 地球对物体的吸引力就是万有引力吗? 哪有卖装豆浆八宝粥的塑料杯子啊,还有就是它那个口是怎么封的,哪有卖那种机器的 下列哪项属于淘宝禁止出售的商品?A.发布普通药品信息B.发布三无自制秘方药品信息C.使用未经权利人许可的图片D.以上都是 请问:锂离子电池的电解质是什么?配比是多少? 卖豆浆的话,用塑料封口杯好,还是一次性纸杯好.哪个更省钱呢? 下面哪些商品禁止在淘宝网上出售?如果买家对一件商家包邮的商品要求7天无理由退货,并且非商品质量问题引起的,退货的邮费如何分配?商家在商城出售商品,若买家索要发票,商家是否需要开 pH=0的无色溶液中 Na+、K+、MnO , NO3-,能大量共存吗 盛热豆浆的封口【塑料杯】杯里的液体加热到多少度时就会【有毒】?小区门口卖热豆浆的应该都见过,他们盛豆浆都是用封口的塑料杯.请问,那种杯子遇到多少度高温时,就会有毒?也就是,杯子 《万有引力》龙一清唱的歌叫什么 co2的核外电子总数怎么求 如何从 鸡蛋中提取钙单质? 如何预防有毒化学物引起的危害? 石墨作电极电解HCl的总方程式是什么 李林与妹妹比赛400m跑,李林每秒跑5m,妹妹每秒跑4m,李林说:“我让你先跑100m.”在这种条件下,谁将获问题没发完,还有几个字.“胜?若李林一定要胜过妹妹,他的速度最少是多少?”把引号里的字 Na2O能跟氧气反应生成Na2O2吗? 在ph=13的溶液中,Cro42-,k+,Na+,SO42-在溶液中能共存吗,为什么?答案是不能,但与Cro42-有颜色有关的解释应该不成立. 塑料杯装热豆浆喝有毒吗 na2o2与na2so3反应为什么不生成氧气 请求翻译:本文利用鸡蛋壳制取乳酸钙,采用高温煅烧法. 在三个相同的容器中,分别盛有甲乙丙三种液体,将三个完全相同的钢球分别沉入容器底部,当钢球静止时,容器底部收到的球的压力大小关系是F甲>F乙>F丙,则液体的密度比较?,请在4点之前 含铁离子的盐类水解后在什么pH环境下沉淀比较完全 为什么 日俄将首次举行外长防长级磋商 欲促进美国批发物价指数9月环比下降0.1%浙江武义江遭日化企业偷排污水 环保部强风暴肆虐欧洲多国IAEA称与伊朗会谈富有成果 将于1叙反对派要求解除卜拉希米叙问题特别代IAEA称与伊朗会谈富有成果 将于1美驻吉尔吉斯使馆收到不明信封 内装白金砖国家共议“气候变化对粮食安全不利消息称美考虑停止对盟国领袖监听 未做快讯:俄罗斯一架武装直升机在莫斯科市中国游客成海外大买家 凸显国内免税业中非民兵与前叛军爆发冲突 造成近40英媒:养老金制度需考虑气候变化 否则格陵兰岛取消铀矿开采禁令恒天然调查:无肉毒杆菌风险 应改进生省委常委分赴教育实践活动联系点参加指台\"立委\":美国这种邪恶国家一定男子“拍卖初夜”以2600美元成交 外交部:日本应停止渲染外部威胁 说明金砖国家共议“气候变化对粮食安全不利秦皇岛将从六个关键环节发力构建分工合理的京津冀产业链省政协十一届三次会议收到提案406件省人代会首次推出《预算解读》“三社联动”共治社区加大生态环境建设力度适应新常态 关键在状态省十二届人大三次会议主席团举行第二次投资曹妃甸 这步棋,走对了!支持企业“走出去”推动经济转型坚定信心克难前行 奋发有为加快发展95.7亿元主要用于推进科技创新促进河北创新发展绿色崛起坚持以经济建设为中心不动摇建立优秀传统文化进校园常态机制主动适应经济发展新常态把才智力量凝聚到创新发展大业上福州:罗源16岁少女醉酒与男子同床 陵水黎族自治县国土环境资源局国有建设海南高等教育国际化再迈新步泰国开始审理英拉弹劾案
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘