全局对象

```
Node.js中的全局对象是global
所有全局变量(除了global本身以外)都是global对象的属性
最根本的作用为全局变量的宿主
```

全局变量

```
//满足以下条件的是全局变量
a.在最外层定义的变量
b.全局对象的属性
c.隐式定义的变量(未定义直接赋值的变量)
```

process

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

process.argv

```
process.argv是命令行参数数组,第一个元素是node,第二个元素是脚本文件名,从第三个元素开始每个元素是一个运行参数;
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`);
})
//命令行执行 node process-args.js one two=three four
//命令行输出
0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four
```

process.stdout

```
process.stdout是标准输出流,通常我们使用console.log()向标准输出打印字符,而process.stdout.write()函数提供了更底层的接口
```

process.stdin

```
process.stdin是标准输入流,初始时它是被暂停的,要向从标准输入读取数据,你必须恢复流,并手动编写流的事件响应函数
process.stdin.resume();
process.stdin.on('data',function(data){
process.stdout.write('read from console:'+data.toString());
})
```

process.nextTick(callback)

```
//process.nextTick(callback)的功能是为事件循环设置一项任务,Node.js会在下次事件循环调响应时调用callback
//Node.js适合I/O密集型的应用,而不是计算密集型的应用,因为一个Node.js进程只有一个线程,因此在任何时刻都
//只有一个事件在执行,如果这个事件占用大量的CPU时间,执行事件循环中的下一个事件就需要等待很久,因此Node.js
//的一个编程原则就是尽量缩短每个事件的执行时间。process.nextTick(callback)提供了一个这样的工具,可以把复杂
//的工作拆散,变成一个个较小的事件;
function doSomething(args,callback){
somethingComplicated(args);
callback();
}
doSomething(function onEnd(){
compute();
})
//假设compute()和somethingComplicated()是两个较为耗时的函数,以上的程序在调用doSomething()时会先执行
somethingComplicated(),然后立即调用回调函数,在onEnd()中又会执行compute()
改写
function doSomething(args,callback){
somethingComplicated(args);
process.nextTick(callback);
}
doSomething(function onEnd(){
compute();
})
//改写后的程序会把上面耗时的操作拆分为两个事件,减少每个事件的执行时间,提高事件响应速度
```

常用工具util

```
util是一个Node.js核心模块,提供常用函数的集合,用于弥补核心javascript的功能过于精简的不足
```

util.inherits

```
//util.inherits(constructor,superconstructor)是一个实现对象间原型继承的函数。
//javascript的面向对象特性是基于原型的,与常见的基于类的不同。
//javascript没有提供对象继承的语言级别特性,而是通过原型复制来实现的。
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);

//Sub仅仅继承了Base在原型中定义的函数,而构造函数内部创造的base属性和sayHello函数都没有被Sub继承;

<h3>util.inspect</h3>

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

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

//showHidden是一个可选参数,如果值为true,将会输出更多隐藏信息

//depth表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多少,如果不指定depth,默认会递归2层

//指定为null表示将不限递归层数完整遍历对象

//如果color值为true,输出格式将会以ANSI颜色编码,通常用于在终端显示更漂亮的效果

//**特别要指出的是,util.inspect 并不会简单的直接把对象转换为字符串,即使该对象定义了toString方法也不会调用

var util = require('util');

function Person(){

this.name = 'bala';

this.toString = function(){
return this.name;
}

}

var obj = new Person();

console.log(util.inspect(obj));

console.log(util.inspect(obj,true));

<h2>事件驱动events</h2>

//events 是Node.js最重要的模块。没有之一,原因是Node.js本身架构就是事件式的,而它提供了唯一的接口,所以堪称Node.js事件编程的基石。

//events模块只提供了一个对象:events.EventEmitter

//events.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','柠檬不酸',1991);

//listener1 柠檬不酸 1991

//listener2 柠檬不酸 1991

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,则移除指定事件的所有监听器

<h3>error事件</h3>

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

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

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

var events = require('events');

var emitter = new events.EventEmitter();

emitter.emit('error');

<h3>继承EventEmitter</h3>

大多数时候我们不会直接使用EventEmitter,而是在对象中继承它,包括fs,net,http在内的,只要是支持事件响应的核心都是EventEmitter的子类

为什么要这么做呢?

1.具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法

2.javascript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系

<h2>文件系统访问</h2>
<h3>文件系统fs</h3>

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

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

如:fs.readFile()---异步

fs.readFileSync()---同步

<h3>fs.readFile</h3>

fs.readFile(filename,[encoding],[callback(err,data)]

//如果不指定编码,data将会是以Buffer形式表示的二进制数据

var fs = require('fs');

fs.readFile('content.txt','utf8',function(err,data){

if(err){

console.log(err);

}else{

console.log(data)

}

}

<h3>fs.open</h3>

fs.open(path,flags,[mode],[callback(err,id)]是POSIX open函数的封装

path为文件的路径

flags可以是:

r:以读取模式打开文件

r+:以读写模式打开文件

w: 以写入模式打开文件,如果文件不存在则创建

w+: 以读写模式打开文件,如果文件不存在则创建

a: 以追加模式打开文件,如果文件不存在则创建

a+: 以读取追加模式打开文件,如果文件不存在则创建

mode参数用于创建文件时给文件指定权限,默认是0666.回调函数将会传递一个文件描述符fd

<h3>fs.read</h3>

fs.read(fd,buffer,offset,length,position,[callback(err,bytesRead,buffer)])是POSIX read函数的封装,相比fs.readFile提供了更底层的接口

功能:是从指定的文件描述符fd中读取数据并写入buffer指向的缓冲区对象

offset: 是buffer的写入偏移量

length: 是要从文件中读取的字节数

position: 是文件读取的起始位置,如果position的值为null,则会从当前文件指针的位置读取

回调函数:传递byteRead和buffer,分别表示读取的字节数和缓冲区对象

var fs = require('fs'); // 引入fs模块

// 打开文件

fs.open('./content.txt', 'r', function(err, fd) {

if (err) {

throw err;

}

console.log('open file success.');

var buffer = new Buffer(255);

// 读取文件

fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {

if (err) {

throw err;

}

// 打印出buffer中存入的数据

console.log(bytesRead, buffer.slice(0, bytesRead).toString());

});

});

//除非必要,一般不用

<h2>HTTP服务器与客户端</h2>

12-《Node.js开发指南》-核心模块的更多相关文章

  1. Node.js开发指南中的例子(mysql版)

    工作原因需要用到nodejs,于是找到了<node.js开发指南>这本书来看看,作者BYVoid 为清华大学计算机系的高材生,年纪竟比我还小一两岁,中华地广物博真是人才辈出,佩服. 言归正 ...

  2. 学习Nodejs:《Node.js开发指南》微博项目express2迁移至express4过程中填的坑

    <Node.js开发指南>项目地址https://github.com/BYVoid/microblog好不容易找到的基础版教程,但书中是基于express2的,而现在用的是express ...

  3. node.js开发指南读书笔记(1)

    3.1 开始使用Node.js编程 3.1.1 Hello World 将以下源代码保存到helloworld.js文件中 console.log('Hello World!'); console.l ...

  4. 《node.js开发指南》partial is not defined的解决方案

    由于ejs的升级,<node.js开发指南>中使用的 partial 函数已经摒弃,使用foreach,include代替 原来的代码是: <%- partial('listitem ...

  5. 《Node.js开发指南》知识整理

    Node.js简介 Node是一个可以让JavaScript运行在服务器端的平台,抛弃了传统平台依靠多线程来实现高并发的设计思路,而采用单线程.异步式I/O.事件驱动式的程序设计模型. 安装和配置No ...

  6. Node.js 开发指南

    1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色: js 异步 io 与事件驱动给服务器带来极高 ...

  7. 11-《Node.js开发指南》-模块和包

    什么是模块? 一个node.js文件就是一个模块,这个文件可能是js代码,json或者编译过的C/C++扩展 创建及加载模块 //a.js var name; exports.setName = fu ...

  8. Node.js 开发指南笔记

    第一章:node简介 介绍了node是什么:node.js是一个让javascript运行在服务器端的开发平台, node能做些什么:[书上的] 具有复杂逻辑的网站 基于社交网络的大规模Web应用 W ...

  9. NODE.JS开发指南学习笔记2

    1.核心模块 核心模块是Node.js的心脏,由一些精简高效的库组成,为其提供了基本的API.2.全局对象 global.所有的的全局变量都是其属性.其根本的作用是作为全局变量的宿主.3.全局变量 1 ...

  10. NODE.JS开发指南学习笔记

    1.Node.js是什么 Node.js是一个让JS运行在服务器端的开发平台,它可以作为服务器向用户提供服务.Node.js中的javascript只是Core javascript,或者说是ECMA ...

随机推荐

  1. 洛谷 题解 P1287 【盒子与球】

    题解:P1287 盒子与球 不了解的:stirling数(斯特林数) - 百度百科 分析如下: 设有n个不同的球,分别用b1,b2,--bn表示.从中取出一个球bn,bn的放法有以下两种: 1) bn ...

  2. 十大C++实战项目,你会几个?【高薪必备】

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼   市面上有很多C++的实战项目,从简单到进阶,学习每个项目都 ...

  3. 这些C++常用内置函数你会几个??

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Regina520  新手注意:如果你C++学的不好,可以去拿我的C+ ...

  4. 笔记||Python3之列表与元组

    列表List: 特性:①列表也是一种Squence类型 ②下标 ③能切片 ④可以存储任何类型的数据,每个元素是任意类型 ⑤内容可以改变:增删改查 1  --  值   列表的元素值是可以改变的   a ...

  5. USB3.0 图像视频传输 开发 CYUSB3014开发基础(导入官方例程) 转

    CYPREE提供的FX3_SDK开发包里面有很多基础的内容,除了前面提到的几个pdf文件外,还有三个文件夹,是官方提供的基础例程.学习CYUSB3014应该就从这里开始,从这几个例程开始.例程共有三个 ...

  6. Mybatis需要注意的细节

    mybatis第二篇 1.${}和#{}的区别 1.#在传参的时候,会自动拼接单引号:$不能拼接单引号; 2.$传参时,一般不支持jdbcType指定类型的写法;#则可以;如: ​ #{name,jd ...

  7. python之MiniWeb框架

    以往,我们多完成的是静态web服务器,主要处理的都是一些已经‘写死’的数据,那么今天,我们来学习一下动态数据的处理. 说到动态数据,我们就需要了解一个东西,那就是web框架. 所谓web框架简单地说就 ...

  8. Python爬虫基础——XPath语法的学习与lxml模块的使用

    XPath与正则都是用于数据的提取,二者的区别是: 正则:功能相对强大,写起来相对复杂: XPath:语法简单,可以满足绝大部分的需求: 所以,如果你可以根据自己的需要进行选择. 一.首先,我们需要为 ...

  9. Django day03之学习知识点

    今日是路由层学习: 3.路由匹配 3.1 正则表达式的特点: 一旦正则表达式能够匹配到内容,会立刻结束匹配关系 直接执行对应的函数.相当于采用就近原则,一旦找到就不再继续往下走了 重点: 正则表达式开 ...

  10. Nginx-HTTP Strict Transport Security(HSTS)

    HTTP Strict Transport Security(HSTS) HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTP ...