Node 核心模块

Posted by Gemicat on November 24, 2015

Node核心模块

1 全局对象

全局对象所有的属性都可以在程序的任何地方访问,在浏览器中,通常window是全局对象,在Node中全局对象是global。

1.1 全局对象与全局变量

global是全局变量的宿主,根据ECMAScript中的定义,满足以下条件的变量是全局变量:

在最外层定义的变量; 全局对象的属性; 隐式定义的变量。

2 常用工具util

2.1 util.inherits

util.inherits(constructor, superConstructor)可以实现对象见原型继承:

var util = require('util');
function Base() {
    //....
};
function Sub() {
    //....
};
util.inherits(Sub, Base);

2.2 util.inspect

util.inspect(object, [showHidden], [depth], [colors])可以讲对象转换成字符串,通常用于调试和错误输出。

3 事件驱动events

3.1 事件发射器

events.EventEmitter的核心是事件发射与事件监听功能的封装,对每个事件支持若干个事件监听器。

var events = require('events');

var emitter = new events.EventEmitter();

emitter.on('someEvent', function (arg1, arg2) {
    console.log("linstener1", arg1, arg2);
});

emitter.on('someEvent', function (arg1, arg2) {
    console.log("linstener2", arg1, arg2);
});

emitter.emit('someEvent', 'gemicat', 1993);

运行结果是:

listener1 gemicat 1993
listener2 gemicat 1993

3.2 error事件

EventEmitter定义当遇到异常时通常会发射error事件,当error被发射时,如果没有相应的监视器,Node会把它当作异常处理。

var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit('error');

4 文件系统fs

fs模块时文件操作的封装。fs模块中所有的操作都提供了异步和同步的两个版本。

4.1 fs.readFile

fs.readFile(filename, [encoding], [callback(err, data)])为异步API fs.readFileSync(filename, [encoding])为同步。

4.2 fs.open

fs.open(path, flags, [mode], [callback(err, data)])

flags可以是以下值

1.r : 只读
2.r+:读写
3.w :只写,如果文件不存在创建
4.w+:读写,如果文件不存在创建
5.a :追加,如果文件不存在创建
6.a+:以读取追加模式打开文件,如果文件不存在创建
mode参数用于创建文件时给文件制定权限,默认是0666.

5 HTP服务器与客户端

5.1 HTTP服务器

http.Server是http模块中的HTTP服务器对象。

1.http.Server的事件

1.request:当客户端请求到来时,该事件被触发,提供两个参数req和res,分别是http.ServerRequest和http.ServerResponse的实例
2.connection:当TCP建立连接时触发,提供一个参数socket,为net.Socket的实例。
3.close:当服务器关闭时触发。

2.获取GET请求内容

可以手动解析URL后面的内容作为GET的请求参数。使用Node的url模块的parse函数。

var http = require('http');
var util = require('util');
var url = require('url');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);

其中query就是我们所谓的GET求情内容。

3.获取POST请求内容

var http = require('http');
var querystring = require('querystring');
var util = require('util');

http.createServer(function (req, res) {
    var post = '';

    req.on('data', function (chunk) {
        post += chunk;
    });

    req.on('end', function () {
        post = querystring.parse(post);
        res.end(util.parse(post));
    });
}).listen(3000);

这种方法非常不安全,效率非常低下。

5.2 HTTP客户端

http提供了两个函数http.request和http.get用于向HTTP服务器发起请求

1.使用http.request发送POST请求:

var http = require('http');
var querystring = require('querystring');

var content = querystring.stringify({
    name: 'gemicat',
    email: 'gemicat@163.com',
    address: 'earth',
});

var options = {
    host: 'www.byvoid.com',
    path: '/application/node/post',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': content.length,
    }
};

var req = http.request(options, function (res) {
    res.setEncoding('utf8');
    res.on('data', function (data) {
        console.log(data);
    })
})

req.write(content);
req.end();

2.使用http.get处理GET请求

var http = require('http');

http.get({host: 'gemicat.github.io'}, function (res) {
    res.setEncoding('utf8');
    res.on('data', function (data) {
        console.log(data);
    });
});