共计 3954 个字符,预计需要花费 10 分钟才能阅读完成。
1.nodejs 的概念 / 益处
2. 简略介绍
1.nodejs 的组成
(1)援用 required 模块,能够用 require 指令来载入 Node.js 模块
(2)创立服务器,能够监听客户端的申请
(3)接管申请与响应申请,客户端可应用浏览器或者终端发送 http 申请,服务器接管申请后返回响应数据
2. 创立利用
创立利用时首先应用 require 指令载入 http 模块,而后应用 http.createServer() 办法创立服务器
3. 回调函数
nodejs 的异步编程次要体现在回调上,node 应用了大量的回调函数,所有的 API 都反对回调。
Node.js 是单过程单线程应用程序,然而通过事件和回调反对并发,所以性能十分高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,应用异步函数调用,并解决并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程相似进入一个 while(true) 的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件产生就调用该回调函数
应用的是事件驱动模型,就是说一个 web server 接管到申请之后,以后的申请就被敞开,本人玩本人的,而后去进行下一个申请,这个申请解决完之后,会被放入队列之中,等队列排到最开始再输入,这个时候会有一个主循环(event loop)始终在监听着事件,当事件被解决完就会触发回调函数,返回队列中
4.eventEmmitter 类
外围:事件触发与事件监听器性能的封装
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
// 逐层事件监听器,通知服务器,我要开始筹备监听这个叫 some_event 的事件了,on 用于绑定事件函数
event.on('some_event', function() {console.log('some_event 事件触发');
});
setTimeout(function() {event.emit('some_event');
// 开启监听器,事件被触发,执行的是 on 前面的那个回调函数
}, 1000);
除了 on 和 emit 之外的一些别的属性
(1)addListener(event, listener) 为指定事件增加一个监听器到监听器数组的尾部
(2)once(event, listener) 为指定事件注册一个单次监听器,只触发一次监听,触发后监听器会立即被解除
(3)removeListener(event, listener) 移除指定事件的某个监听器(必须已被注册过的监听器)
5.Buffer(缓冲区)
因为 js 只有字符串数据类型,没有二进制数据类型,所以在解决流这种必须用到二进制数据的时候,nodejs 定义了一个 Buffer 类,用来创立一个专门寄存二进制数据的缓存区
6.Stream(流)
流式一个形象接口,是有序而且有方向的数据汇合 (?),nodejs 外面有四种流类型
(1)readable:可读(fs.createReadStream())
(2)writable:可写 (fs.createWriteStream())
(3)duplex:可读可写 (net.Socket)
(4)transform:操作被写入数据,而后读出数据 (zlib.createDeflate())
7. 模块零碎
模块是 node.js 应用程序的根本组成部分,文件和模块是一一对应的
nodejs 提供了 exports 和 require 两个对象,exports 是模块公开的接口,require 用于从内部获取一个模块的接口
nodejs 存在四类模块(原生模块以及三种文件模块)
优先级最高的是从文件模块缓存中加载,而后是从原生模块加载,最初才是从文件中加载
8.http 服务器
var http = require("http");
http.createServer(function(request, response) {response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();}).listen(8888);
3. 罕用的 API
1. 全局变量
(1)_filename:以后正在执行的脚本的文件名,输入的是文件所在位置的绝对路径
(2)_dirname:以后执行脚本所在的目录
(3)process:用于形容以后 nodejs 过程状态的对象,提供与操作系统的简略接口,
Process 一些罕用的属性
1)stdout/stderr/stdin:规范输入流,规范谬误流以及规范输出流
2)argvargv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是 node,第二个成员是脚本文件名,其余成员是脚本文件的参数。
3)execPath:返回执行以后脚本的 Node 二进制文件的绝对路径
4)env:返回一个对象,成员为以后 shell 的环境变量
5)config:一个蕴含用来编译以后 node 执行文件的 javascript 配置选项的对象。它与运行 ./configure 脚本生成的 “config.gypi” 文件雷同
process 一些罕用办法
1)chdir(directory):扭转当前工作过程的目录,如果操作失败抛出异样
2)cwd():返回以后过程的工作目录
3)nextTick(callback):一旦以后事件循环完结,调用回调函数
2. 常用工具——util 模块
(1)util.inherits(constructor, superConstructor) 是一个实现对象间原型继承 的函数,只继承原型中定义的函数,而不会继承构造函数中发明的属性
(2)util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的办法
3. 文件系统(fs)
文件系统的办法中均有同步和异步两个版本,异步的办法函数最初一个参数是回调函数,回调函数的第一个参数蕴含了错误信息,倡议用异步,因为性能更高,速度更快,而且没有阻塞。
(1)fs.open(path,flags,[,mode], callback):异步模式下关上文件的语法格局
path – 文件的门路。
flags – 文件关上的行为,指定文件的读写。
mode – 设置文件模式 (权限),文件创建默认权限为 0666(可读,可写)。
callback – 回调函数,带有两个参数如:callback(err, fd)。
(2)fs.stat(path, callback):异步模式下获取文件信息的语法格局
(3)fs.writeFile(filename, data[, options], callback),异步模式下写入文件
(4)fs.read(fd, buffer, offset, length, position, callback) 异步模式下读取文件的语法格局
(5)fs.close(fd, callback)
(6)fs.ftruncate(fd, len, callback) 异步模式狭窄截取文件的语法格局
(7)fs.unlink(path, callback) 删除文件
(8)fs.mkdir(path[, mode], callback) 创立目录
(9)fs.readdir(path, callback) 读取目录
(10)fs.rmdir(path, callback) 删除目录
4. 其余常识
1.GET/POST 申请
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))); // parse 函数提供了 get 申请的参数解析办法
}).listen(3000);
var http = require('http');
var querystring = require('querystring');
var util = require('util');
http.createServer(function(req, res){
var post = ''; // 定义了一个 post 变量,用于暂存申请体的信息
req.on('data', function(chunk){ // 通过 req 的 data 事件监听函数,每当承受到申请体的数据,就累加到 post 变量中
post += chunk;
});
req.on('end', function(){ // 在 end 事件触发后,通过 querystring.parse 将 post 解析为真正的 POST 申请格局,而后向客户端返回。post = querystring.parse(post);
res.end(util.inspect(post));
});
}).listen(3000);
http.ServerRequest 并没有一个属性内容为申请体,起因是期待申请体传输可能是一件耗时的工作,歹意的 POST 申请会大大耗费服务器的资源,所有 node.js 默认是不会解析申请体的,当你须要的时候,手动来做
2.web 模块
web 服务器指的是驻留在因特网上某种类型计算机的程序,基本功能是提供 web 信息浏览服务。罕用的 web 服务器是 Apache,Nginx,IIS
http 模块次要用于搭建 HTTP 服务端和客户端,应用 HTTP 服务器或客户端性能必须调用 http 模块