1.非阻塞I/O描述
访问数据库取得搜索结果的时候,查询数据库以及获取到数据需要一定的事件,传统的阻塞式的编程方式,在这种情况下需要终止程序的执行,等待响应结果之后才能继续向下执行.
非阻塞I/O当遇到这种情况时,可以把查询数据后要处理的业务逻辑通过回调函数的方式去执行;不会阻塞当前代码的执行.
2.事件循环机制:
nodejs中的事件(客户端请求),对比浏览器中的事件(用户点击按钮,提交表单).在nodejs中,在一个时刻只能执行一个事件回调函数,但是在执行这个回调函数的中途中可能会转而处理其他的回调函数(新出发的事件等),处理完成后,返回继续执行原事件回调函数.
3.源码编译安装nodejs
./configure
make
make install;
4.nodejs模块
nodejs中依赖模块功能划分所有的功能,每个模块为一个JS文件;每个模块中定义的全局变量只有在该模块中才能被访问;只有使用exports对象导出到外部
demo.js文件中定义一个函数
exports.printHelloWorld = function foo(){
return "helloWorld";
}
如果要在别的模块中使用demo.js中定义的函数,需要使用require引入
var demo = require('./demo.js');//通过dmeo.js文件的路径加载dmeo.js模块
demo.printHelloWorld();//访问demo.js模块内的foo()方法
5.nodejs的核心模块
arrert:为应用程序的单元测试添加断言处理
buffer:用于实现二进制数据的存储于转化
child_process:用于子进程的穿件与管理
cluster:用于实现多进程
console:用于为控制台输出信息
crypto:用于实现数据的加密加密处理
debugger:用于实现一个内置调试器来进行应用程序调试
dns:用于实现与DNS相关的处理
domain:用于实现多个I/O之间的协作处理
events:用于为事件处理提供一个基础类
fs:用于操作文件及文件系统
http:实现http服务器及客户端'
https:实现https服务器与客户端
net:用于创建tcp服务器与客户端
os:用于获取操作系统信息
path:用于处理文件路径
querystring:用于处理http请求中使用的查询字符串
readline:用于处理一行标准输入流
repl:用于实现REPL交互式环境
stream:用于为流的输入输出处理提供一个基础类
string_decoder:用于实现二进制数据到字符串数据之间的转换
tls:用于使用openSSL来实现TLS/SSL通信处理
tty:用于获取来自于tty终端的信息
url:用于实现URL字符串的解析与格式化
util:用于实现各种实用函数
vm用于为javascript脚本代码提供一个独立的运行环境
zlib:内部使用zlib类库来实现数据的压缩及解压缩处理
6.nodejs中追加的类函数与对象
Buffer类用于为二进制数据的存储提供一个缓存区
setTimeout函数:
clearTimeout
setInterval
clearInterval
require函数
module对象:用于访问模块信息
process对象:用于访问进程信息
7.使用第三方的模块对nodejs已有的功能进行扩展
模板引擎可以创建PHP页面JSP页面
8.http.createServer(function(req,res){
}).listen(1337,'127.0.0.1');
使用http模块创建一个接受客户端请求及对客户端请求进行相应的应用程序,应用程序中定义了一个回调函数用于该回调函数指定了当服务器接受到客户端段请求时所要执行的处理程序
9.node项目的目录结构
10.REPL 环境 node进入
控制台
.save ./save.js -->将在REPL中执行的命令保存到一个文件中
.load ./save.js --->将文件中所保存的表达式依次加载到REPL环境中
11.
重定向标准输出流: node app.js 1> info.log
重定向标准错误输出流:node app.js 2> error.log
console.log() ---console.info()
console.warn() --console.error()
12.统计一段代码的执行事件,一定要使用相同的参数
console.time('demo');
console.timeEnd('demo')
13.setTimeout 与 setInterval区别???
14.模块加载会运行模块中的每一行代码,模块在首次加载后将缓存在内存缓存区中,意味着相同模块的多次引用得到的都是同一个模块对象
15
16.输出当前环境中已缓存的模块
16.__filename变量:获取当前模块文件的带有完整绝对路径的文件名.
__dirname变量:当前文件的路径.
17.EventEmitter类:所有可能触发事件的对象都是继承了EventEmitter类的子类对象,
EventEmitter类的各种方法
addListener(event,listener)
on(event,listener)
once(event,listener):指定事件只执行一次事件处理函数
removeListenser(event,listener):对指定事件解除事件处理函数
removeAllListenser([event]):对指定事件解除所有处理函数
setMaxListeners(n):指定事件处理函数的最大数量.n为整数值,代表最大的可指定事件处理函数的数量
listenser(event):获取指定事件的所有事件处理函数
emit(event,[arg1],[arg2]...):手工触发指定事件
18.事件循环机制
当用户向服务器发出一个请求的时候,将会触发http服务器的一个在nodejs中被定义的request事件.
nodejs中采用非阻塞I/O机制,意味着所有要求应用程序所进行的处理,如HTTP请求,数据库查询,文件的读取写入操作.都不会再处理结束之前阻塞程序的运行.这些处理都是独立进行的,当处理结束的时候,会触发一个回调事件,也就是说我们在nodejs中所要编写的是各种I/O事件的回调函数中的处理
在一个时刻只能执行一个回调函数,因为javascript是单线程的.????
异步I/O: I/O等这些操作是由谁来完成的,硬盘网络,内存??这个是不会占据线程的吗??
对于每个回调函数的执行速度会特别的快,因为他并不需要等待任何I/O的处理结果.
19.模块文件
.js javascript脚本文件
.json 的JSON文本文件
.node 经过编译后的二进制模块文件
20.require函数中值使用('demo.js')来引入模块,默认认为该模块为node_modules下的.
使用目录来管理模块-->在nodejs中可以将目录名指定为模块名,以便可以通过目录来管理模块,只需要为目录指定一个入口.
将目录名指定为模块名的方法在应用程序根目录下创建一个node_modules子目录,在其中为模块创建一个目录,并且在其中放入index.js
-->另一种方式在应用程序根目录下的node_modules子目录的foo子目录下创建一个package.json文件
21.模块对象的属性
在模块文件内部,可以访问当前模块的如下一些属性
module.id -->属性为当前模块的id 主模块id为''.',其余模块的ID属性为模块文件的完整路径
module.filename --->属性为当前模块文件的文件名
module.loaded--->true当前模块加载完毕 false-->当前模块未加载完毕
module.parent-->当前模块的父模块对象
module.children-->一个数组存放了当前模块的所有子模块对象,即当前模块中已加载的所有模块对象