Node.js 基础库

全局对象

Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global对象的属性。

我们在 Node.js 中能够直接访问到对象通常都是 global 的属性,如 console、process.

全局变量:在最外层定义的变量, 全局对象的属性, 隐式定义的变量(未定义直接赋值的变量)。

当你定义一个全局变量时,这个变量同时也会成为全局对象的属性, 在 Node.js 中你不可能在最外层定义变量,

因为所有用户代码都是属于当前模块的,而模块本身不是最外层上下文。

process全局变量

global 对象的属性, 它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口

输入, 输出等都是出自于这.process.stdout是标准输出流

rocess.nextTick(callback)的功能是为事件循环设置一项任务,Node.js 会在下次事件循环调响应时调用 callback.

初学者很可能不理解这个函数的作用,有什么任务不能在当下执行完,需要交给下次事件循环响应来做呢?

因为一个 Node.js 进程只有一个线程,因此在任何时刻都只有一个事件在执行。如果这个事件占用大量的 CPU 时间,

执行事件循环中的下一个事件就需要等待很久,因此 Node.js 的一个编程原则就是尽量缩短每个事件的执行时间.

process.nextTick() 提供了一个这样的工具,可以把复杂的工作拆散,变成一个个较小的事件。

console全局变量

console 用于提供控制台标准输出, 如果有多个参数,则以类似于 C 语言 printf() 命令的格式输出。

第一个参数是一个字符串,如果没有参数,只打印一个换行。

util 常用工具

util.inherits 继承

var util = require('util');
function Base() {
this.name = 'base';
this.base = 1991;
this.sayHello = function() {
console.log('Hello ' + this.name);
};
}
Base.prototype.showName = function() {
console.log(this.name);

};

function Sub() {
this.name = 'sub';
}
util.inherits(Sub, Base);

var objBase = new Base();
objBase.showName();
objBase.sayHello();
console.log(objBase);
var objSub = new Sub();
objSub.showName();
//objSub.sayHello();
console.log(objSub);

util.inspect

util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的方法,

通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。

var util = require('util');
function Person() {
this.name = 'byvoid';
this.toString = function() {
return this.name;
};
}
var obj = new Person();
console.log(util.inspect(obj));
console.log(util.inspect(obj, true));

运行结果是:
{ name: 'byvoid', toString: [Function] }
{ toString:
{ [Function]
[prototype]: { [constructor]: [Circular] },
[caller]: null,
[length]: 0,
[name]: '',
[arguments]: null },
name: 'byvoid' }

事件驱动 events

events 是 Node.js 最重要的模块,没有“之一”,

事件发射器

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件发射与事件监听器功能的封装.

。EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义,对于每个事件

EventEmitter 支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,

事件参数作为回调函数参数传递。

var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {  // 定义事件监听
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {  // 定义事件监听
console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'byvoid', 1991);  // 事件发射
运行的结果是:
listener1 byvoid 1991
listener2 byvoid 1991

常用API

EventEmitter.on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数 listener。

EventEmitter.emit(event, [arg1], [arg2], [...]) 发射 event 事件,传递若干可选参数到事件监听器的参数表。

EventEmitter.once(event, listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。

EventEmitter.removeListener(event, listener) 移除指定事件的某个监听器,listener 必须是该事件已经注册过的监听器。

EventEmitter.removeAllListeners([event]) 移除所有事件的所有监听器,如果指定 event,则移除指定事件的所有监听器。

error 事件

EventEmitter 定义了一个特殊的事件 error,它包含了“错误”的语义,我们在遇到异常的时候通常会发射 error 事件。

当 error 被发射时,EventEmitter 规定如果没有响应的监听器,Node.js 会把它当作异常,退出程序并打印调用栈.

我们一般要为会发射 error事件的对象设置监听器,避免遇到错误后整个程序崩溃.

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

运行时会显示以下错误:
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick

文件系统 fs

fs 模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等 POSIX 文件系统操作。

与其他模块不同的是,fs 模块中所有的操作都提供了异步的和同步的两个版本,

例如读取文件内容的函数有异步的 fs.readFile() 和同步的fs.readFileSync()。

HTTP 服务器与客户端

Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端.

http.Server 的事件

http.Server 是一个基于事件的 HTTP 服务器,所有的请求都被封装为独立的事件,

开发者只需要对它的事件编写响应函数即可实现 HTTP 服务器的所有功能。

request:当客户端请求到来时,该事件被触发,提供两个参数 req 和res,分别是http.ServerRequest 和

  http.ServerResponse 的实例http.ServerResponse 的实例,表示请求和响应信息

connection:当 TCP 连接建立时,该事件被触发,提供一个参数 socket,为net.Socket 的实例

  connection 事件的粒度要大于 request, 因为客户端在Keep-Alive 模式下可能会在同一个连接内发送多次请求。

close :当服务器关闭时,该事件被触发。注意不是在用户连接断开时

http.ServerRequest

http.ServerRequest 是 HTTP 请求的信息,是后端开发者最关注的内容。它一般由http.Server 的 request 事件发送,

作为第一个参数传递,通常简称 request 或 req

data :当请求体数据到来时,该事件被触发。该事件提供一个参数 chunk,表示接收到的数据

end :当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来

close: 用户当前请求结束时,该事件被触发。不同于 end,如果用户强制终止了传输,也还是调用close。

获取 GET 请求内容

//httpserverrequestget.js
var http = require('http');
var url = require('url');
var util = require('util');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);
在浏览器中访问 http://127.0.0.1:3000/user?name=byvoid&email=byvoid@byvoid.com,我
们可以看到浏览器返回的结果:
{ search: '?name=byvoid&email=byvoid@byvoid.com',
query: { name: 'byvoid', email: 'byvoid@byvoid.com' },
pathname: '/user',

path: '/user?name=byvoid&email=byvoid@byvoid.com',
href: '/user?name=byvoid&email=byvoid@byvoid.com' }

通过 url.parse①,原始的 path 被解析为一个对象,其中 query 就是我们所谓的 GET请求的内容,而路径则是 pathname

获取 POST 请求内容

最常见的就是 GET 和 POST, GET 请求把所有的内容编码到访问路径中,POST 请求的内容全部都在请求体中.

Node.js 默认是不会解析请求体的,当你需要的时候需要手动来做.

//httpserverrequestpost.js
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.inspect(post));
});
}).listen(3000);

http.ServerResponse

http.ServerResponse 是返回给客户端的信息,决定了用户最终能看到的结果,它也是由 http.Server 的 request 事件发送的,

作为第二个参数传递,一般简称为response 或 res。

response.writeHead(statusCode, [headers]):向请求的客户端发送响应头

  statusCode 是 HTTP 状态码,如 200 (请求成功)、404 (未找到)等

response.write(data, [encoding]):向请求的客户端发送响应内容. data 是一个 Buffer 或字符串,表示要发送的内容

response.end([data], [encoding]):结束响应,告知客户端所有发送已经完成

  当所有要返回的内容发送完毕的时候,该函数 必须 被调用一次

HTTP 客户端

常用的参数如下所示。

host :请求网站的域名或 IP 地址。

port :请求网站的端口,默认 80。

method :请求方法,默认是 GET

path :请求的相对于根的路径,默认是“/”。QueryString 应该包含在其中

headers :一个关联数组对象,为请求头的内容。

 

posted @ 2016-04-14 22:33  神之一招  阅读(544)  评论(0编辑  收藏  举报