阅读更多

16顶
3踩

编程语言

翻译新闻 针对初学者的 Node.js 教程

2013-08-29 10:20 by 副主编 WnouM 评论(9) 有12083人浏览
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
> console.log('Hello World');
Hello World
undefined




安装Node.js

Node.js的安装十分容易。只需在这里下载满足你需要的安装程序即可。

已安装好Node.js,下一步做什么?

安装结束后,你可以输入一个新命令“node”。使用该“node”命令有两种不同的方法。第一种不带任何参数,将打开一个交互式Shell“>”(REPL: read-eval-print-loop),你可以在这里执行JavaScript代码。

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

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

hello.js

console.log('Hello World');

$ node hello.js
Hello World




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

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

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

example_log.txt

2013-08-09T13:50:33.166Z A 2
2013-08-09T13:51:33.166Z B 1
2013-08-09T13:52:33.166Z C 6
2013-08-09T13:53:33.166Z B 8
2013-08-09T13:54:33.166Z B 5


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

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

my_parser.js

// 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 end our app.
  if (err) throw err;
 
  
// logData is a Buffer, convert to string.
  var text = logData.toString();
});


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

现在我们对它进行解析。

my_parser.js

// 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 }
});


现在,当你将该文件作为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

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.');


在上面,我说是的基本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

var express = require('express'),
    app = express();
 
app.use(express.static(__dirname + '/public'));
 
app.listen(8080);


$ 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

{
  "name" : "MyStaticServer",
  "version" : "0.0.1",
  "dependencies" : {
    "express" : "3.3.x"
  }
}


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

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

$ npm install


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

代码的组织

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

parser.js

// 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;


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

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

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

my_parser.js

// 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 }
});


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

总结

希望该教程可以帮助到你。Node.js是一个强大、灵活的技术,可以帮助解决各种各样的问题。它已经超出了我们的想像。

原文链接:An absolute beginner's guide to Node.js
  • 大小: 47.9 KB
  • 大小: 19.4 KB
  • 大小: 53.1 KB
16
3
评论 共 9 条 请登录后发表评论
9 楼 exe 2013-09-02 14:52
大致看了一下,没有重点,不知道Node.js能干什么。踩一把,谢谢!
8 楼 rainsilence 2013-08-31 21:41
witcheryne 写道
ramus 写道
亲,你还是没有吧node.js是什么说出来.应用范围,场景,优势,与javascript有什么区别,与后台语言有什么区别 ...

bitray 写道
我还是没全看懂.我知道了node.js是一个开发服务器用的技术,是一个javascript的runtime.那么他对比apache有什么优势呢?什么情况下我要用它呢?为什么不使用C,C++或者java呢?

天生异步,天生适合处理并发问题。
科普,看InfoQ node.js板块
http://www.infoq.com/cn/nodejs/?utm_source=infoq&utm_medium=header_graybar&utm_campaign=topic_clk


只是异步IO,语言本身不是异步
7 楼 pdsmsf 2013-08-30 17:11
上下求索的浩 写道
问个外行问题,有什么比较好的编写javascript的IDE? Aptana用过感觉不好用,特别是好像不支持html5的canvas
WebStorm
6 楼 上下求索的浩 2013-08-30 16:16
问个外行问题,有什么比较好的编写javascript的IDE? Aptana用过感觉不好用,特别是好像不支持html5的canvas
5 楼 yq5858588 2013-08-30 14:12
请问nodejs能写tcp接受数据服务程序吗
4 楼 ljqian 2013-08-29 15:47
额。。我是不是可以把nodejs理解为拥有强大类库的javascript面向对象技术。
3 楼 witcheryne 2013-08-29 15:46
ramus 写道
亲,你还是没有吧node.js是什么说出来.应用范围,场景,优势,与javascript有什么区别,与后台语言有什么区别 ...

bitray 写道
我还是没全看懂.我知道了node.js是一个开发服务器用的技术,是一个javascript的runtime.那么他对比apache有什么优势呢?什么情况下我要用它呢?为什么不使用C,C++或者java呢?

天生异步,天生适合处理并发问题。
科普,看InfoQ node.js板块
http://www.infoq.com/cn/nodejs/?utm_source=infoq&utm_medium=header_graybar&utm_campaign=topic_clk

2 楼 bitray 2013-08-29 14:21
我还是没全看懂.我知道了node.js是一个开发服务器用的技术,是一个javascript的runtime.那么他对比apache有什么优势呢?什么情况下我要用它呢?为什么不使用C,C++或者java呢?
1 楼 ramus 2013-08-29 13:51
亲,你还是没有吧node.js是什么说出来.应用范围,场景,优势,与javascript有什么区别,与后台语言有什么区别 ...

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 想做电商,如何做起?

    ProcessOn的用户中有很多做电商运营的朋友,所以在整理网站模板的时候,发现了很多高质量电商运营相关的模板,内容从对电商平台的熟悉,到销售日工作的流程,以及电商促销的方式等,都是电商从业者自己宝贵的工作宝贵经验与知识总结。 这些内容大到电商运营的战略方向,小到页面的文案编辑,都能够给从事电商行业的朋友一些参考,因此我们专门汇总了一些被浏览/克隆量高的文件,希望能给大家提供一些帮助。 入门电商 ...

  • 新手小白怎么做电商?如何运营?

    以上就是抖音小店的整体运营流程,以及新手小白可能遇到的一些问题和解决方法。关注我们,下一期内容将详细讲解如何上架、运营和提高销量的具体流程。希望这些信息对你有帮助,助你在电商之路上顺利前行。聊了这么多,如果对你有帮助,我介绍一下我们的产品【飞瓜智投】,它融合了很多官方算算法在,比如 10分钟的成交额,停留。可以帮你判断下个时间节点的推流!可以帮你更好的做好直播电商。

  • 新手小白如何从0到1学会电商运营,这3个方法带你月入五位数

    与其咬紧牙关过日子,不如尝试一下提升自己的收入。 事实上大多数人在知道这个道理之前还是会选择前者。因为尝试就意味着失败,而对于大多数人来说,漫长的人生都经不住一次失败。 那么如果你看到了这篇文章。首先我很开心,有两个原因,有一个人知道我是谁,我是干什么的,另外一个原因则是我能用我从业电商4年的经验帮助到你。 我是赵越,一个从业4年无货源运营的创业者。目前有自己的公司以及十多名员工,无论是从开公司创业还是个人运营店铺,我都能够解决一些问题。 如果有空看完下面的内容。就算不能让你从0到1,但也能够帮你了解电商创

  • 【扫盲贴】讲透大数据,我只需要一顿饭

    作者:燕飞燕飞,Kyligence 大数据老司机,拥有超过15年的大数据/数据仓库领域从业经验,对大数据/数据仓库的建设规划、架构设计、技术体系、方法论及主流厂商的产品和解决方案,均有深入的研究和实践。【开胃菜】十五年前,刚开始工作,从帝都回老家。某长辈和蔼的问我:“工作了啊,做什么的?”我踌躇半天答曰:“挨踢(IT)。”长辈不假思索的来了一句:“哦,在中关村卖光盘啊!”我......我........

  • 邮局 解题报告

    历届试题 邮局   时间限制:1.0s   内存限制:256.0MB     问题描述 C村住着n户村民,由于交通闭塞,C村的村民只能通过信件与外界交流。为了方便村民们发信,C村打算在C村建设k个邮局,这样每户村民可以去离自己家最近的邮局发信。   现在给出了m个备选的邮局,请从中选出k个来,使得村民到自己家最近的邮局的距离和最小。其中两点之间的距离定义为两点之间的直线距离。

  • 企业Ruby的愿望树

    [img]http://www.infoq.com/resource/articles/Enterprise-Ruby-Wish-List/en/smallimage/image_ruby_wishlist.jpg[/img] http://www.infoq.com/articles/Enterprise-Ruby-Wish-List 极端分子和狂热主义分子为...

  • 听Ruby之父畅谈编程语言的设计

    本文摘自《松本行弘:编程语言的设计与实现》 1-1 自己创造编程语言的意义 通过实际创造一门新的编程语言,可以学到编程语言的设计思路和实现方法。随着开源的普及,创造新编程语言的门槛一下子...Ruby 是我出于兴...

  • 不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)

     另外,本文中的观点并不全部是我个人的想法,相当一部分来自我以前聊过天的某些大牛,他们很多来自微软、百度、腾讯等知名企业,并且很多已经成为技术骨干,我曾经从他们那里受益匪浅,于是我把他们的指教结合自身...

  • excel教程自学网_收藏!这37个自学网站,一年让你省下十几万

    2、MOOC网中国大学MOOC(慕课)是爱课程网携手云课堂打造的在线学习平台,每一个有提升愿望的人,都可以在这里学习中国最好的大学课程,学完还能获得认证证书。3、网易公开课用户可以在线免费观看来自于哈佛...

  • 【软件设计原则】CUPID——快乐的编码

    但是,虽然“可以理解”可能是一个崇高的愿望,但它并不是那么高的标准!大约在 Martin 撰写有关重构的文章的同时,计算先驱 Richard P. Gabriel 描述了代码可居住的想法: “宜居性是源代码的特性,它使 [人们] ...

  • 技术实现思路总结

    为了编码更加有效率的进行,本人将会在此博客中记录一些 解决编码需求中的一些思路,供自己已经程序员朋友们共同学习探讨。 持续更新中 1、关闭 和删除的概念

  • 电商系统如何做搜索引擎?

    作者:李伟山,历任华为,阿里技术专家,米么技术总监,在分布式,大容量高并发等领域,有一定积累。来自:米么骚客0 什么搜索引擎?搜索引擎(search engine)是指根...

  • 关于转行软件测试行业必备课程学习的解答

    那么我们进入正题,现在国家互联网行业的再度崛起,互联网+思想的浪潮拍打下,越来越多的企业也在寻找自己的软件开发团队,而软件测试这个行业也是在逐步 完善,前景非常可观,而现在需求量自大,以及相对来说其入门...

  • 这40个自学网站,一年让你“白捡”十几万,快点收藏

    2、课工厂 课工场提供互联网企业岗位相关的课程,面向互联网企业中热门的产品,技术,设计,运维等方向提供岗位路线课程,也擅长制作精美的入门基础课程,精选了大量课件免费提供给在校大学生。 3、起点学院 这个...

  • 16个出色的开源软件

    随着数据时代的来临,开源软件越来越被重视,尤其在Web应用服务器、应用程序架构和大数据处理方面更是应用广泛,其中Hadoop、Apache 、MYSQL等开源软件更是家喻户晓,在企业大型网络应用中承担重要作用。免费、运行...

  • 这37个自学网站,一年让你省下十几万。钱买辆车他不香嘛

    中国大学MOOC(慕课)是爱课程网携手云课堂打造的在线学习平台,每一个有提升愿望的人,都可以在这里学习中国最好的大学课程,学完还能获得认证证书。 3、网易公开课 用户可以在线免费观看来自于哈佛大学等世界级...

  • programming language history

    作为最早的编程语言之一,Lisp在计算机科学,包括树数据结构, 自动存储管理, 动态打字, 条件词, 高阶函数, 递归,自托管 编译器,[6]而读-年代-打印循环.[7] 名字 LISP派生自“列表处理器”。[8] 链接列表是Lisp的...

  • 收藏!这37个自学网站,一年让你省下十几万

    中国大学MOOC(慕课)是爱课程网携手云课堂打造的在线学习平台,每一个有提升愿望的人,都可以在这里学习中国最好的大学课程,学完还能获得认证证书。 3、网易公开课 用户可以在线免费观看来自于哈佛大学等世界级名校的...

  • MongoDB学习指导

    u 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 u 面向集合存储,易存储对象类型的数据:存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型...

  • 37个自学网站,一年让你省下十几万

    37个自学网站,一年让你省下十几万 ...中国大学MOOC(慕课)是爱课程网携手云课堂打造的在线学习平台,每一个有提升愿望的人,都可以在这里学习中国最好的大学课程,学完还能获得认证证书。 3、网易公开课 ...

Global site tag (gtag.js) - Google Analytics