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);
});
});