全局对象

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 :一个关联数组对象,为请求头的内容。

Node.js 基础库的更多相关文章

  1. Node.js基础与实战

    Node.js基础与实战 Node.jsJS高级进阶 NODE原理与解析 REPL交互环境 模块与NPM Buffer缓存区 fs文件操作 Stream流 TCP&UDP 异步编程 HTTP& ...

  2. Node.js基础知识

    Node.js入门   Node.js     Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始.比较独特的是,Node.js会假设在POSIX环境下运行 ...

  3. 10慕课网《进击Node.js基础(一)》初识promise

    首先用最简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</titl ...

  4. 进击Node.js基础(二)

    一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...

  5. node.js基础模块http、网页分析工具cherrio实现爬虫

    node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言      说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...

  6. NodeJs>------->>第三章:Node.js基础知识

    第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 console.log(" node app1.js 1> ...

  7. 07慕课网《进击Node.js基础(一)》HTTP小爬虫

    获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...

  8. 03慕课网《进击Node.js基础(一)》API-URL网址解析

    url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...

  9. 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子

    版本:偶数位为稳定版本,基数为非稳定版本 - 0.6.x - 0.7.x    - 0.8.x -0.9.x    -0.10.x  -0.11.x 概念:Node.js采用谷歌浏览器的V8引擎,用C ...

随机推荐

  1. 在IE下,如果在readonly的input里面键入backspace键,会触发history.back()

    在IE下,如果在readonly的input里面键入backspace键,会触发history.back(), 用以下jQuery代码修正之 $("input[readOnly]" ...

  2. 2.2 C#的注释

    注释,是代码中的一些“说明文档”,注释注释本身不会参与程序代码的编译和运行,仅仅是为了方便程序员阅读. C#的注释分为:单行注释.多行注释.文档注释. 单行注释的符号是2条斜杠线(斜线的方向是左下到右 ...

  3. Android中处理崩溃异常和记录日志

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...

  4. MXNet学习~试用卷积~跑CIFAR-10

    第一次用卷积,看的别人的模型跑的CIFAR-10,不过吐槽一下...我觉着我的965m加速之后比我的cpu算起来没快多少..正确率64%的样子,没达到模型里说的75%,不知道问题出在哪里 import ...

  5. h5视频上传之前端视频压缩研究

    今天领导接到一个h5上传手机视频的需求,主要是要看用户在这个视频中有没有完成某个任务,比如投篮进了几个球. 但是由于手机拍摄的视频文件大小有点大,直接上传的话,用户流量顶不住,而且特别耗时,在这样的情 ...

  6. Linux 下 PHP 扩展 cURL 编译安装

    下载 cURL http://pan.baidu.com/s/1hqrHWkG (curl-7.39.0.tar.gz) 3.98MB 解压: tar zxvf curl-7.39.0.tar.gz ...

  7. EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

    官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...

  8. 使用自定义签名的https的ssl安全问题解决和metro的webservice调用

    最近一直在忙新的项目,每天加班到8点多,都没来写博客了.新的项目遇到了很多问题,现在趁着突然停电来记录下调用https的问题吧. 我们服务主要是,我们调用数据源数据,并且再提供接口供外部数据调用. 我 ...

  9. centos 配置 ssl服务

    使用的是appach 2.4.10 版本 各个版本配置不同 1.首先修改httpd.conf 文件 appach 安装目录下的 conf文件夹中找到 #LoadModule socache_shmcb ...

  10. Linux下PHP+MYSQL+APACHE配置方法

    apache: http://www.apache.org  mysql: http://www.mysql.com  php: http://www.php.net/downloads.php  g ...