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

希望这篇文章能解决你这样一个问题:“我现在已经下载好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. Android下实现控件的叠加显示

    <FrameLayout android:layout_width="fill_parent" android:layout_height="match_paren ...

  2. python学习笔记(win32print API介绍)

    最近博主在研究用python控制打印机 这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html Op ...

  3. Android编码风格

    整理一下51CTO学院中张凌华老师讲的编码风格课程 一. 项目开发目录命名: Requirement - 需求相关文档 Design - 设计 Planning&Log - 计划,日志,会议 ...

  4. 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面

    Donut Caching是缓存除了部分内容以外的整个页面的最好的方式,在它出现之前,我们使用"输出缓存"来缓存整个页面. 何时使用Donut Caching 假设你有一个应用程序 ...

  5. memcached学习(4). memcached的分布式算法

    memcached的分布式 正如第1次中介绍的那样, memcached虽然称为"分布式"缓存服务器,但服务器端并没有"分布式"功能. 服务器端仅包括 第2次. ...

  6. rsync安装使用

    安装 yum install rsync mkdir /etc/rsyncd cd /etc/rsyncd vi rsyncd.conf pid file = /var/run/rsyncd.pid ...

  7. 操作笔记:linux下查看端口被占用

    [root@iZ945sgm0ugZ /]# lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1192 jet ...

  8. PHP 统计中文字符串的长度

    中文网站一般会选择两种编码:gbk/gb2312或是utf-8. gbk编码下每个中文字符所占字节为2,例: $zhStr = ‘您好,中国!’; echo strlen($zhStr); // 输出 ...

  9. 浅谈Bootstrap自适应功能在Web开发中的应用

    随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...

  10. Javascript 命名空间模式

    命名空间是通过为项目或库创建一个全局对象,然后将所有功能添加到该全局变量中.通过减少程序中全局变量的数量,实现单全局变量,从而在具有大量函数.对象和其他变量的情况下不会造成全局污染,同时也避免了命名冲 ...