1.1 后端nodejs核心模块 - OhNaNaSun/angularBlog GitHub Wiki

nodejs

1. path

path.normalize(p) 规范化字符串路径,注意 '..' 和 `'.' 部分 多个斜杠会被替换成一个; 路径末尾的斜杠会被保留; Windows 系统上, 会使用反斜杠。 实例:

path.normalize('/foo/bar//baz/asdf/quux/..')
// returns
'/foo/bar/baz/asdf'

path.join([path1], [path2], [...]) 连接所有参数, 并且规范化得到的路径. 参数必须是字符串。在 v0.8 版本非字符串参数会被悄悄忽略。 在 v0.10 及以后版本将会抛出一个异常。

2. process:进程

process.env:一个包括用户环境的对象。

process对象 process.exit(): 用法

db.on('error', function(err){
    console.error('connect to %s error: ', config.connectionstring, err.message);
    process.exit(1);
});

process.nextTick(callback)

callback {Function}

在事件循环的下一次循环中调用 callback 回调函数。

这 **不是 setTimeout(fn, 0) 函数的一个简单别名,因为它的效率高多了。**该函数能在任何 I/O 事前之前调用我们的回调函数。但是这个函数在层次超过某个限制的时候,也会出现瑕疵。

3. http

http.createServer([requestListener]) 返回一个新的web服务器对象: 是一个EventEmitter实例 参数 requestListener 是一个函数,它将会自动加入到 'request' 事件的监听队列.

Class: http.Server: server.listen(port, [hostname], [backlog], [callback]) 开始在指定的主机名和端口接收连接。如果省略主机名,服务器会接收指向任意IPv4地址的链接(INADDR_ANY)。

http.get(url, function(res){}):发get请求,爬虫中有用到 `http.request()方法也用于发出HTTP请求

3.1 由http延伸 Buffer

传输的过程是Stream(流程),传的东西是Buffer.

编码方法:规定了符号的二进制代码的存储方式cnblog。 utf-8:以utf-8的方式将"a"存储为二进制。

imooc

JavaScript字符串是以UTF-8格式存储的,处理二进制的能力是很弱的。而网络层请求、响应、文件、图片都以二进制格式进行交互. 所以nodejs就提供了这样一个接口。创建了一个专门存放二进制数据的缓存区。并提供了一系列方法来处理这些数据(必然需要编码方式规定怎样存储这些数据). 一个 Buffer 实例类似于一个整数数组,但对应着 V8 堆之外的一个原始内存分配区域。 每个Buffer实例有自己的编码方法。我们实例化的时候设置的。Buffer实例可以转换为字符.toString()。字符串可以转换为buffer(带编码方式)。

数组方法基本都移植到了buffer上。

3.2 由http延伸 fs模块

读文件返回的data就是buffer

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);//<Buffer  XX XX>
});

3.3 由http延伸 Stream

流是一个抽象接口,被 Node 中的很多对象所实现。比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流。流是可读、可写或兼具两者的。所有流都是 EventEmitter 的实例。

http,fs,tcp...都用到了Stream 流以Buffer的形式存在,这样更高效。

  • fs使用stream更精细地控制文件流
var fs = require("fs");
var readStream = fs.createReadStream("test.png");
var out = fs.createWriteStream("testwrite.png");
readStream
	.on("data", function(chunk){
		//防暴仓
		if(!out.write(chunk)){
			console.log("still cached");
			readStream.pause()
		}
	})
	.on("end", function(){
		out.end();
	})
out
	.on("drain", function(){
		console.log("data drains")
		readStream.resume()
	})
//fs.createReadStream("test.png").pipe(fs.createWriteStream("testPipe.png"));
  • Stream模块
var Readable = require("stream").Readable;
var Writable = require("stream").Writable;
var readStream = new Readable();
var writeStream = new Writable();
    readStream.push("I");
    readStream.push("love");
    readStream.push("imooc");
    readStream.push(null);

writeStream._write = function(chunk, encode, cb){
    console.log(chunk.toString());
    cb();
}
readStream.pipe(writeStream);

3.4 http延伸 Net模块

net.createServer([options], [connectionListener])

创建一个新的 TCP 服务器(是一个EventEmitter实例)。参数 connectionListener 会被自动作为 'connection' 事件的监听器。

3.5 http涉及 util模块

提供工具方法 util.isArray([]) util.inherits(constructor, superConstructor)

4. 全局对象(Global Object)

Node.js 全局对象 __dirname __dirname 表示当前执行脚本所在的目录。

nodejs中路径的坑

参考: 浅析 NodeJs 的几种文件路径 只有在 require() 时才使用相对路径(./, ../)(相对于当前的这个文件) 的写法,其他地方一律使用绝对路径(是相对于启动脚本所在目录的路径),如下:


// 当前目录下
path.dirname(__filename) + '/test.js';
// 相邻目录下
path.resolve(__dirname, '../lib/common.js');

5. fs

参考: readdir(),readdirSync() readdir方法用于读取目录,返回一个所包含的文件和子目录的数组。

6. cryto

api return crypto.createHash("md5").update(password).digest("base64");