新的上班时间是周二至周六,工作之余当然要坚持学习啦。

希望这篇文章能解决你这样一个问题:“我现在已经下载好Node.Js了,该做些什么呢?”

原文URL:http://blog.modulus.io/absolute-beginners-guide-to-nodejs

本文的组成:上文的翻译以及小部分自己的理解。所有文章中提到的JS代码,都是经过测试,可运行并产生正确结果的。

What is Node.js?

关于Node.Js,要注意一点:Node.js本身并不是像IIS,Apache一样的webserver,它是一个JavaScript 的运行环境。当我们需要搭建一个HTTP 服务器的时候,我们可以借助Node.Js提供的库快捷的写一个。

Installing Node

Node.js 安装是非常方便的,如果你在用Windows or Mac,去这个页面就可以了download page.

I've Installed Node, now what?

以WINDOWS为例,一旦安装好Node.Js之后,可以通过两种不同方式来调用Node。

方式一:CMD 下输入node,进入交互模式,输入一行行的JS代码,Node.Js会执行并返回结果,例子:

$ node
> console.log('Hello World');
Hello World
undefined

PS:上一个例子的undefined来自于console.log的返回值。

方式二:CMD 下输入node 文件名(当然需要先CD到该目录)。例子:

hello.js 下的代码:

console.log('Hello World');
 
$ node hello.js
Hello World

Doing Something Useful - File I/O

使用纯粹的Js原生代码是有趣但是不利于工程开发的,Node.JS提供了一些有用的库(modules),下面是一个使用Node.js提供的库分析文件的例子:

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

我们做的第一件事情是读出该文件的所有内容。

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

filesystem (fs 的API ref) module 提供了一个可以异步读取文件并且结束后执行回调的函数,内容以 Buffer的形式返回(一个byte数组),我们可以调用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 }
});

Asynchronous Callbacks

刚才的例子中使用到了异步回调,这在Node.Js编码中是广泛被使用的,究其原因是因为Node.Js是单线程的(可以通过某些特殊手段变为多线程,但一般真的不需要这么做)。故而需要各种非阻塞式的操作。

这种非阻塞式的操作有一个非常大的优点:比起每一个请求都创建一个线程的Web Server。Node.Js在高并发的情况下,负载是小得多的。

Doing Something Useful - HTTP Server

我们来运行一个HTTP server吧, 直接复制 Node.js homepage.上的代码就可以了。

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://localhost:8080 就能看到结果啦。

上面的例子显然过于简单,如果我们需要建立一个真正的web server。我们需要能够检查什么正在被请求,渲染合适的文件,并返回。而好消息是,Express已经做到这一点了。

Doing Something Useful - Express

Express 是一个可以简化开发的框架。我们执行npm install 来安装这个package。

$ cd /my/app/location
$ npm install express

指令执行完毕后,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 文件夹放了一个"my_image.png" 。我们就可以在浏览器输入http://localhost:8080/my_image.png 来获取这个图片. 当然,Express 还提供了非常多的其它功能。

Code Organization

刚才的例子中我们使用的都是单个文件,而实际的开发中,我们会设计到代码如何组织的问题。

我们试着将最开始的文字解析程序重新组织。

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;

关于这里的exports 的含义请参考我的博客:Node.Js学习01: Module System 以及一些常用Node Module.

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

这样,文字解析的部分就被抽离了出来。

Summary

Node.js 是强大而灵活的。

 

完全面向于初学者的Node.js指南的更多相关文章

  1. 专门针对初学者的Node.js教程

    转载原文:http://www.csdn.net/article/2013-08-28/2816731-absolute-beginners-guide-to-nodejs Node.js的教程并不缺 ...

  2. Node.js 指南(迁移到安全的Buffer构造函数)

    迁移到安全的Buffer构造函数 移植到Buffer.from()/Buffer.alloc() API. 概述 本指南介绍了如何迁移到安全的Buffer构造函数方法,迁移修复了以下弃用警告: 由于安 ...

  3. 【转】使用VS开发 Node.js指南

    参考:https://www.visualstudio.com/features/node-js-vs 这篇文章主要介绍了使用VS开发 Node.js的方法,主要是使用NTVS(Node.js Too ...

  4. 初学者的Node.js学习历程

    废话篇: 对于我这个新手的不能再白菜的人来说,nodejs的大名都有耳闻,所以说他是一项不可不克服的技能也是可以说的.但是之前没有搞清楚的情况之下胡乱的猜测,是的我对node.js没有一个具体的概念的 ...

  5. 面向复杂应用,Node.js中的IoC容器 -- Rockerjs/core

    Rockerjs Core 项目地址 项目主页 基于 TypeScript 和注解的轻量级IoC容器,提供了依赖注入.面向切面编程及异常处理等功能.Rockerjs Core可在任意工程中引入,是一个 ...

  6. Node.js学习笔记 01 搭建静态服务器

    希望这篇文章能解决你这样一个问题:“我现在已经了解了一些Node.Js基本概念了,怎么搭一台静态服务器呢?” 请参考一下博主的前两篇文章: 完全面向于初学者的Node.js指南 Node.Js的Mod ...

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

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

  8. Node.js 学习资源

    这篇文章编译整理自Stack Overflow的一个如何开始学习Node.js的Wiki帖,这份资源列表在SO上面浏览接近60万次,数千个收藏和顶.特意整理发布到这里,其中添加了部分中文参考资料. 学 ...

  9. 学习Node.js笔记(一)

    一.什么是Node.js 1.1.Node.js是什么 Node.js是用来编写高性能网络服务器的JavaScript工具包 Node.js 是一个基于Chrome JavaScript 运行时建立的 ...

随机推荐

  1. ofstream的问题

    ofstream在多字节编码的项目中, 写入中文目录写不了, 英文目录可以 换成c库的fopen, fwrite可以

  2. Windows 2008下部署Exchange Server 2007

    对于很多政府及企业来说,微软的邮件服务器Exchange Server都是一个不错的通信和协作平台选择,尤其新版邮件服务器Exchange Server 2007 和OCS的组合,在微软UC平台上创下 ...

  3. Ant 脚本打印系统属性变量、ant内置属性

    Ant 脚本打印系统属性变量.ant内置属性 作用 编写ant脚本的时候,经常会引用到系统属性,本脚本用于打印系统常用属性(System.getProperties)与环境变量(Environment ...

  4. 在Service Fabric上部署Java应用,体验一把微服务的自动切换

    虽然Service Fabric的Java支持版本还没有正式发布,但是Service Fabric本身的服务管理.部署.升级等功能是非常好用的,那么Java的开发者可以如何利用上Service Fab ...

  5. jQuery中 wrap() wrapAll() 与 wrapInner()的区别

    今晚看书的时候发现jQuery有三个包裹节点的方法,百度了一下jQuery wrap() / wrapAll() / wrapInner(),果然搜索结果 W3School的文档说明是排第一的. 可是 ...

  6. android网络判断

    //ConnectivityManager管理网络连接相关的操作 ConnectivityManager connectivityManager = (ConnectivityManager) con ...

  7. SVN中文件属性

    从SVN中checkout代码,然后设置crontab 定时执行脚本,发现permission denied 查看发现脚本没有可执行权限 但是,之前项目中的代码是有该权限的,于是猜想应该可以对SVN中 ...

  8. Java 动态编译组件 & 类动态加载

    1.JDK6 动态编译组件 Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序.该包中提 ...

  9. 华为OJ平台——字符串匹配

    题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true  - 表示短字符串中所有字符均在长字符串中出现 false - ...

  10. 阅读jQuery源码的18个惊喜

    注释:本文使用$.fn.method指代调用一系列选中的元素的方法.例如,$.fn.addClass,指代$('div').addClass(‘blue’) 或 $('a.active’).addCl ...