七天学会NodeJS-学习笔记

在网上发现一篇nodeJS教程,名为七天学会NodeJS,标题很有吸引力。我不指望七天能学会,只希望可以入门,下面是我的学习笔记和遇到的问题。

教程网址:http://nqdeng.github.io/7-days-nodejs/

系统环境:virtualBox ubuntu 14.10

nodeJS版本:0.10.35

 

一、安装

我使用过三种方法来安装nodeJS,分别是二进制文件、apt-get命令和编译安装。

  1. 从官网下载对应系统的二进制文件,双击安装。网站:http://www.nodejs.org/download/
  2. 在ubuntu下使用命令apt-get安装,命令如下:
    sudo apt-get install nodejs
    
    sudo apt-get install npm
  3. 从官网下载源码,编译安装。我参考了博客园的一篇文章,地址:http://www.cnblogs.com/hwpayg/archive/2012/11/04/2753404.html

 二、模块

在nodeJS中,一般会将代码模块化。在编写模块时,一般会用到三个变量:require、exports、module。

  1. require用于加载和使用别的模块。如:
    1 var foo1 = require('./foo');
    
    2 var foo2 = require('./foo.js');
    
    3 var foo3 = require('/home/user/foo');
    
    4 var foo4 = require('/home/user/foo.js');
    
    5 
    
    6 // 也可以用来加载JSON文件
    
    7 var data = require('./data.json');
  2. exports是导出对象,用于导出当前模块中的公有方法与属性,在其他模块中使用require得到的就是exports对象。下面的例子导出了一个公有方法
    1 exports.hello = function () {
    
    2     console.log('Hello World!');
    
    3 };
  3. module对象可以访问到当前模块的一些相关信息,常用于替换当前模块中的导出对象,如:
    1 module.exports = function () {
    
    2     console.log('Hello World!');
    
    3 };

三、包

有些模块比较复杂,需要由多个子模块组成,我们把由多个子模块组成的大模块称为包。如:

// 下面是包cat的目录结构,main.js是包的入口文件

- /home/user/lib/

    - cat/

        head.js

        body.js

        main.js

 这时,我们加载包cat的方式就是 require("/home/user/lib/cat/main"),但这看起来像是访问一个文件。为了让访问路径更加简洁,可以进行以下调整:

// package.json是包cat的配置文件

- /home/user/lib/

    - cat/

        + doc/

        - lib/

            head.js

            body.js

            main.js

        + tests/

        package.json

其中,package.json的内容如下:

1 {

2     "name": "cat",

3     "main": "./lib/main.js"

4 }

这样,加载包cat的方式就是 require("/home/user/lib/cat") 

四、命令行程序

正常,使用js文件的方式是 node /home/user/bin/node-echo.js Hello World 。这样子显然不够酷,如果想让js文件像命令行程序那样使用,如: node-echo Hello World 。在linux环境中,我们可以做如下配置:

  1. 在js文件顶部插入代码 #! /usr/bin/env node ,用于指定当前脚本的解析器。
  2. 赋予js代码文件执行权限 chmod +x /home/user/bin/node-echo.js 
  3. 创建软链: sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo 

这样我们可以像使用命令行程序那样使用js代码。

五、工程目录

一般,一个标准的工程目录看起来是这个样子的:

- /home/user/workspace/node-echo/   # 工程目录

    - bin/                          # 存放命令行相关代码

        node-echo

    + doc/                          # 存放文档

    - lib/                          # 存放API相关代码

        echo.js

    - node_modules/                 # 存放三方包

        + argv/

    + tests/                        # 存放测试用例

    package.json                    # 元数据文件

    README.md                       # 说明文件

 六、文件操作

小文件操作

 1 var fs = require('fs');

 2 

 3 function copy(src, dst) {

 4     fs.writeFileSync(dst, fs.readFileSync(src));

 5 }

 6 

 7 function main(argv) {

 8     copy(argv[0], argv[1]);

 9 }

10 

11 main(process.argv.slice(2));

上面的代码会将src文件内容一次性读取到内存,然后再一次性写到磁盘中。这种操作只适用于小文件,文件太大时,内存会不够用。

大文件操作

 1 var fs = require('fs');

 2 

 3 function copy(src, dst) {

 4     fs.createReadStream(src).pipe(fs.createWriteStream(dst));

 5 }

 6 

 7 function main(argv) {

 8     copy(argv[0], argv[1]);

 9 }

10 

11 main(process.argv.slice(2));

Buffer (数据块)

nodeJS使用Buffer类来进行二进制数据的操作。如:

 1 // 创建一个Buffer类的实例

 2 var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);

 3 

 4 // 获取指定位置的字节

 5 bin[0]; // => 0x68;

 6 

 7 // 转化为字符串

 8 var str = bin.toString('utf-8'); // => "hello"

 9 

10 // 字符串转化为二进制数据

11 var bin = new Buffer('hello', 'utf-8'); // => <Buffer 68 65 6c 6c 6f>

Stream (数据流)

 1 var rs = fs.createReadStream(src);

 2 var ws = fs.createWriteStream(dst);

 3 

 4 rs.on('data', function (chunk) {

 5     if (ws.write(chunk) === false) {

 6         rs.pause();

 7     }

 8 });

 9 

10 rs.on('end', function () {

11     ws.end();

12 });

13 

14 ws.on('drain', function () {

15     rs.resume();

16 });

 

 File System (文件系统)

 nodeJS通过内置模块fs提供对文件的操作,fs的API基本可以分为三类:

  1. 文件属性操作,如:fs.stat fs.chmod fs.chowd
  2. 文件内容操作,如:fs.readFile fs.readdir fs.writeFile fs.mkdir
  3. 底层文件操作,如:fs.open fs.read fs.write fs.close

下面以fs.readFile为例,说明fs的API用法

1 fs.readFile(pathname, function (err, data) {

2     if (err) {

3         // Deal with error.

4     } else {

5         // Deal with data.

6     }

7 });

 

七、网络编程 

创建一个简单http服务器

1 var http = require('http');

2 

3 http.createServer(function (request, response) {

4     response.writeHead(200, { 'Content-Type': 'text-plain' });

5     response.end('Hello World\n');

6 }).listen(8124);

 

注意:监听1024以下端口时,需要root权限

 

你可能感兴趣的:(nodejs)