转载原文:http://www.csdn.net/article/2013-08-28/2816731-absolute-beginners-guide-to-nodejs

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代码。

  1. $ node
  2. > console.log('Hello World');
  3. Hello World
  4. undefined

上面案例中,我在Shell中键入了“console.log('Hello World')”,并敲回车。Node便开始执行该代码,并显示刚才记录的信息,同时打印出“undefined”。这是因为每条命令都会返回一个值,而console.log没有任何返回,故输出“undefined”。

Node命令的另一种用法是执行一个JavaScript文件。这是我们平时最常用的方法。

hello.js

  1. <b>console.log('Hello World');</b>
  1. <b>$ node hello.js
  2. Hello World</b>

该案例中,我将“console.log('Hello World');”命令存入一个文件中,并将该文件作为node命令的参数。Node运行文件中JavaScript代码,并输出“Hello World”。

案例一:文件的输入与输出

Node.js包含一组强大的库(模块),可以帮助我们做很多事。第一个案例中,我将打开一个Log文件,并对它进行解析。

example_log.txt

  1. <b>2013-08-09T13:50:33.166Z A 2
  2. 2013-08-09T13:51:33.166Z B 1
  3. 2013-08-09T13:52:33.166Z C 6
  4. 2013-08-09T13:53:33.166Z B 8
  5. 2013-08-09T13:54:33.166Z B 5</b>

该Log数据什么意思并不重要,基本可以确定每条信息都包含一条数据、一个字母和一个值。我希望将每个字母后面的值进行累加。

我们要做的第一件事是读出文件的内容。

my_parser.js

  1. <b>// Load the fs (filesystem) module
  2. var fs = require('fs');
  3. // Read the contents of the file into memory.
  4. fs.readFile('example_log.txt', function (err, logData) {
  5. // If an error occurred, throwing it will
  6. // display the exception and end our app.
  7. if (err) throw err;
  8. // logData is a Buffer, convert to string.
  9. var text = logData.toString();
  10. });</b>

通过内置的文件(fs)模块,我们可以很容易进行文件的输入/输出操作。fs模块有一个readFile方法,该方法以文件路径、回调函数为参数。该回调函数在完成文件读取后调用。文件数据读取后存储在Buffer类型中,为基本的字节数组。我们可以通过toString()方法将它转化为字符串。

现在我们对它进行解析。

my_parser.js

  1. <b>// Load the fs (filesystem) module.
  2. var fs = require('fs');
  3. // Read the contents of the file into memory.
  4. fs.readFile('example_log.txt', function (err, logData) {
  5. // If an error occurred, throwing it will
  6. // display the exception and kill our app.
  7. if (err) throw err;
  8. // logData is a Buffer, convert to string.
  9. var text = logData.toString();
  10. var results = {};
  11. // Break up the file into lines.
  12. var lines = text.split('\n');
  13. lines.forEach(function(line) {
  14. var parts = line.split(' ');
  15. var letter = parts[1];
  16. var count = parseInt(parts[2]);
  17. if(!results[letter]) {
  18. results[letter] = 0;
  19. }
  20. results[letter] += parseInt(count);
  21. });
  22. console.log(results);
  23. // { A: 2, B: 14, C: 6 }
  24. });</b>

现在,当你将该文件作为node命令的参数时,执行该命令将打印出如下结果,执行完毕后退出。

  1. $ node my_parser.js
  2. { A: 2, B: 14, C: 6 }

我大部时候将Node.js作为脚本使用,正如上面所展示的那样。它更易于使用,是脚本程序有力的替代者。

异步回调

正如在上例中看到的那样,Node.js典型的模式是使用异步回调。基本上,你告诉Node.js要做的事,它执行完后便会调用你的函数(回调函数)。这是因为Node是单线程的。在你等待回调函数执行过程中,Node可继续执行其他事务,不必被阻塞直到该请求完毕。

这对于Web服务器尤其重要。在现代Web应用访问数据库的过程中特别普遍。当你等待数据库返回结果的过程中,Node可以处理更多请求。与每次连接仅处理一个线程相比,它使你以很小的开销来处理成千上万个并行连接。

案例二:HTTP服务器

Node内建有一个模块,利用它可以很容易创建基本的HTTP服务器。请看下面案例。

my_web_server.js

  1. <b>var http = require('http');
  2. http.createServer(function (req, res) {
  3. res.writeHead(200, {'Content-Type': 'text/plain'});
  4. res.end('Hello World\n');
  5. }).listen(8080);
  6. console.log('Server running on port 8080.');</b>

在上面,我说是的基本HTTP服务器。该例中所创建的并不是一个功能全面的HTTP服务器,它并不能处理任何HTML文件、图片。事实上,无论你请求什么,它都将返回“Hello World”。你运行该代码,并在浏览器中输入“http://localhost:8080”,你将看见该文本。

  1. $ node my_web_server.js

现在你可能已经注意到一些不一样的东西。你的Node.js应用并没有退出。这是因为你创建了一个服务器,你的Node.js应用将继续运行,并响应请求,直到你关闭它。

如果你希望它成为一个全功能的Web服务器,你必须检查所收到的请求,读取合适的文件,并返回所请求的内容。值得高兴的是,有人已经帮你做了这个艰难的工作。

案例三:Express框架

Express为一个框架,可使创建网站的过程十分简单。你首先需要安装它。除了node命令,你还需要访问“npm”命令。利用该工具,你可以访问社区所创建的庞大模块集。其中之一就是Express。

  1. $ cd /my/app/location
  2. $ npm install express

当你安装了一个模块,它将出现在应用程序所在目录的“node_modules”文件夹中。现在我们可以利用Express来创建一个基本的静态文件服务器。

my_static_file_server.js

  1. <b>var express = require('express'),
  2. app = express();
  3. app.use(express.static(__dirname + '/public'));
  4. app.listen(8080);</b>
  1. $ 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

  1. <b>{
  2. "name" : "MyStaticServer",
  3. "version" : "0.0.1",
  4. "dependencies" : {
  5. "express" : "3.3.x"
  6. }
  7. }</b>

package.json文件包含了应用程序的基本信息。其中“dependencies”部分描述了你想安装模块的名称和版本。该案例,接受Express 3.3的任何版本。你可以在该部分列出你想要的所有依赖。

代替之前一个个安装每个依赖,现在我们可以运行一个命令,即可将它们全部安装完成。

  1. $ npm install

运行该命令,npm将在当下文件夹中查找“package.json”文件。一旦找到,即可安装所列出的所有依赖。

代码的组织

在大部分应用程序中,你的代码往往被分割到几个文件中。现在让我们把最开始案例中的Log分析脚本分离出来。这样该程序将更易于测试与维护。

parser.js

  1. <b>// Parser constructor.
  2. var Parser = function() {
  3. };
  4. // Parses the specified text.
  5. Parser.prototype.parse = function(text) {
  6. var results = {};
  7. // Break up the file into lines.
  8. var lines = text.split('\n');
  9. lines.forEach(function(line) {
  10. var parts = line.split(' ');
  11. var letter = parts[1];
  12. var count = parseInt(parts[2]);
  13. if(!results[letter]) {
  14. results[letter] = 0;
  15. }
  16. results[letter] += parseInt(count);
  17. });
  18. return results;
  19. };
  20. // Export the Parser constructor from this module.
  21. module.exports = Parser;</b>

在此创建了一个新文件,来存放Log分析脚本。这仅仅是一种标准JavaScript,还有很多方法可用来封装该代码。我选择重新定义一个JavaScript对象,这样更容易进行单元测试。

该程序中最重要的部分是“module.exports = Parser;”这一行代码。它告诉Node从该文件中要输出的内容。在该例中,我输出了构造函数,用户可以用Parser对象来创建实例。你可以输出任何你想要的。

现在我们看一下,如何导入该文件,来使用Parser对象。

my_parser.js

  1. <b>// Require my new parser.js file.
  2. var Parser = require('./parser');
  3. // Load the fs (filesystem) module.
  4. var fs = require('fs');
  5. // Read the contents of the file into memory.
  6. fs.readFile('example_log.txt', function (err, logData) {
  7. // If an error occurred, throwing it will
  8. // display the exception and kill our app.
  9. if (err) throw err;
  10. // logData is a Buffer, convert to string.
  11. var text = logData.toString();
  12. // Create an instance of the Parser object.
  13. var parser = new Parser();
  14. // Call the parse function.
  15. console.log(parser.parse(text));
  16. // { A: 2, B: 14, C: 6 }
  17. });</b>

如模块一样,文件被引入其中,你需要输入路径,而非名称。

总结

希望该教程可以帮助到你。Node.js是一个强大、灵活的技术,可以帮助解决各种各样的问题。它已经超出了我们的想像。(编译:陈秋歌 审校:夏梦竹)

原文链接:An absolute beginner's guide to Node.js

 

专门针对初学者的Node.js教程的更多相关文章

  1. 10+ 最佳的 Node.js 教程和实例

    如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用.API服务编写.投票问卷应用.人物投票APP.社交授权. Node.js on Raspberry Pi ...

  2. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  3. Node.js 教程 04 - 模块系统

    前言: Node.js的模块系统类似于C/C++的文件引用,可以声明对象,也可以定义类 创建对象. 大家这么理解,就简单了. 定义: 为了让Node.js的文件可以相互调用,Node.js提供了一个简 ...

  4. Node.js教程系列~目录

    Node.js这个东西在近几年火起来了,而且会一直火下去,无论在infoq还是在cnblogs,csdn上,都可以到处看到它的样子,它主推的应该就是异步式I/O 吧,是的,设计的很完美,很吸引人,虽然 ...

  5. [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题

    花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是遇到了些问题,特整理在此. <1>.由于node.msi安装包已经自动添加了 ...

  6. 【转载】Node.js 教程(菜鸟教程系列)

    很好的一篇教程:Node.js 教程 简单做下笔记 概述 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立 ...

  7. 实用的 Node.js 教程,工具和资源

    这里分享一批实用的实用的 Node.js 教程,工具和资源. Node.js是一个建立在Chrome之上的JavaScript运行时平台,可方便地构建快速,可扩展的网络应用程序.Node.js使用事件 ...

  8. [转载]Node入门 » 一本全面的Node.js教程

    http://www.nodebeginner.org/index-zh-cn.html 作者: Manuel Kiessling 翻译: goddyzhao & GrayZhang & ...

  9. Node.js教程

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的服务器端平台.Node.js是由瑞恩·达尔在2009年开发的,它的最新版本是v0.10.36. N ...

随机推荐

  1. Android 仿360桌面小人

    首先自定义FloatsWindowView,用于显示动画小人. import android.annotation.SuppressLint; import android.content.Conte ...

  2. C# async await 例子

    private static async void Worker() { Console.Write("main thread id is :{0}",Thread.Current ...

  3. 走进Groovy (一)

    一直很喜欢脚本语言,但是一直在不大的公司工作,用得一直是“高大上”的JAVA语言,在真正的项目中,没什么机会用到脚本语言.这两年,又断断续续的用了2年的Ruby,再回头继续用JAVA,说实话,真感觉J ...

  4. NPO贴片电容容量范围对照表

    NPO贴片电容简述 NPO(COG)贴片电容属于Class 1温度补偿型电容.它的容量稳定,几乎不随温度.电压.时间的变化而变化.尤其适用于高频电子电路. NPO(COG)贴片电容特性 具有最高的电容 ...

  5. Pro/Engineer wildfire 5.0 野火版系列下载及安装方法

    三.PTC Pro/Engineer wildfire 5.0 M030 野火版最新版 DVD 下载(多国语言) 1.野火下载站下载32&64位下载:[32位] http://down.pro ...

  6. 完美解决CTRL+空格不能切换中/英文输入法的问题

    首先任务栏上的输入法图标上点右键选择设置. 然后选择键设置,双击第一个“在不同的输入语言之间切换”先勾选“切换输入语言”下面选择左手ALT.取消右边“切换键盘布局”前的勾. 然后进入“中文(简体)输入 ...

  7. Course(简单的字符串处理问题)

    Course 时间限制:1000 ms  |  内存限制:65535 KB [问题描述] There is such a policy in Sichuan University that if yo ...

  8. Orz 终于有了自己的博客地址

    新博客地址:http://www.wnjxyk.cn/

  9. Stars(树状数组+线段树)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. 去掉android的屏幕上的title bar

    在配置文件里修改 (关键代码:android:theme="@android:style/Theme.NoTitleBar.Fullscreen",如果想只是去除标题栏就后面不用加 ...