在网上发现一篇nodeJS教程,名为七天学会NodeJS,标题很有吸引力。我不指望七天能学会,只希望可以入门,下面是我的学习笔记和遇到的问题。
教程网址:http://nqdeng.github.io/7-days-nodejs/
系统环境:virtualBox ubuntu 14.10
nodeJS版本:0.10.35
一、安装
我使用过三种方法来安装nodeJS,分别是二进制文件、apt-get命令和编译安装。
sudo apt-get install nodejs sudo apt-get install npm
二、模块
在nodeJS中,一般会将代码模块化。在编写模块时,一般会用到三个变量:require、exports、module。
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');
1 exports.hello = function () { 2 console.log('Hello World!'); 3 };
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环境中,我们可以做如下配置:
这样我们可以像使用命令行程序那样使用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基本可以分为三类:
下面以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权限