events模块 只提供一个对象:events.EventEmitter。其核心是事件触发与事件监听功能的封装。
方法1 addListener(event,listener) 为指定事件添加一个监听器 至监听器数组的尾部。
2 on(event,listener) 为指定事件注册一个监听器接受一个字符串event 和一个回调函数
3 once(event,listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,后立即解除该监听器。
4 removeListener(event,listener) 移除指定事件的某个监听器,
5 removeAllListeners([event]) 移除指定事件的某个监听器 如果指定事件,则移除指定事件的所有监听器。
6 listeners(event) 返回指定事件的监听器数组
7 setMaxListeners(n) 监听器的限制数量 默认10个
8 emit(event,[arg1],[arg2]) 按参数顺序执行每个监听器,如果事件有注册监听返回true,否则faulse
9 listenerCount(emitter,event) 返回指定事件的监听器数量
EventEmitter定义了一个特殊的事件error ,遇到异常情况时会触发
.emit('error');
var events = require('events'); var eventEmitter = new events.EventEmitter(); // 监听器 #1 var listener1 = function listener1() { console.log('监听器 listener1 执行。'); } // 监听器 #2 var listener2 = function listener2() { console.log('监听器 listener2 执行。'); } // 绑定 connection 事件,处理函数为 listener1 eventEmitter.addListener('connection', listener1); // 绑定 connection 事件,处理函数为 listener2 eventEmitter.on('connection', listener2); var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection'); console.log(eventListeners + " 个监听器监听连接事件。"); // 处理 connection 事件 eventEmitter.emit('connection'); // 移除监绑定的 listener1 函数 eventEmitter.removeListener('connection', listener1); console.log("listener1 不再受监听。"); // 触发连接事件 eventEmitter.emit('connection'); eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection'); console.log(eventListeners + " 个监听器监听连接事件。"); console.log("程序执行完毕。");
Buffer类 创建一个专门存放二进制数据的缓冲区,类似于一个整数数组,存储数据。
创建buffer类 1 var buf = new Buffer(10); 创建长度为10字节的buffer实例
2 var buf = new Buffer{[10,20,30,40]}; 通过数组创建
3 var buf = new Buffer ('www.runoob.com','utf-8');
写入缓冲区
buf.write(string) 返回值是实际写入的大小 为数字 14
从缓冲区读取数据
buf.toString('utf-8',0,5) 编码 起始索引,终止索引
buf.toJSON(buf) 返回json对象
缓冲区合并 Buffer.concat([buf1,buf2])
缓冲区比较 buf.compare(buf1); 返回-1则buf在buf1之前,返回0 则相同,返回>0则之后/
拷贝缓冲区 buf.copy(buffer1)
裁剪缓冲区 buf.slice(1,7)默认0到buf.length 返回一个新的缓冲区
缓冲区长度 buf.length
Stream 一个抽象的接口,有四种流类型:Readable-可读操作;writable-可写操作;duplex 可读可写操作;transform操作被写入数据然后读出结果。
常用的事件 data-当有数据可读是触发;end -没有更多的数据可读是触发 ; error 在接收和写入过程中发生错误时触发;finish所有数据已被写入到底层数据是触发;
管道流 readerStream.pipe(writerStream);
var fs = require("fs"); // 创建一个可读流 var readerStream = fs.createReadStream('input.txt'); // 创建一个可写流 var writerStream = fs.createWriteStream('output.txt'); // 管道读写操作 // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中 readerStream.pipe(writerStream); console.log("程序执行完毕");
链式流 一般用于管道操作。
var fs = require("fs"); var zlib = require('zlib'); // 压缩 input.txt 文件为 input.txt.gz fs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); console.log("文件压缩完成。");
// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));
console.log("文件解压完成。");
模块系统:一个node.js文件就是一个模块,提供了exports和require两个对象,其中 exports是模块公开的接口,require用于从外部获取一个模块的接口的exports对象。
// 解压 input.txt.gz 文件为 input.txt fs.createReadStream('input.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('input.txt')); console.log("文件解压完成。"); //main.js var Hello = require('./hello'); hello = new Hello(); hello.setName('BYVoid'); hello.sayHello();
全局变量:global
__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。
__dirname 表示当前执行脚本所在的目录。
setTimeout(cb,ms) 全局函数在指定的毫秒数后执行指定的函数cb。
clearTimeout(t) 停止一个之前var t= setTimeout(cb,ms)创建的定时器。
process 描述当前node.js 进程状态的对象,process有很多方法和属性,方便更好的与控制系统的交互。
process.abort(); process.cwd(); ......
文件系统:
数组 Array
初始化 1 构造函数 var arr = new Array();
new Array(3) //[ , , ]
new Array('sid','chen',false) //
2 字面量方法 var arr1 = []
检测方法
arr instanceof Array //true
Array.isArray(arr) //true
转换 Object.keys(obj) //把索引作为薪的数组 将对象转换为数组
split('')
toString() join(',') 数组转换成字符串
.sort(自定义方法) 修改数组本身 排序 以字符串的顺序,同时修改数组本身
.reverse() 修改数组本身 倒叙
栈和队列操作 (数组)
push(102,103) //放入数组的末尾
pop() //取出数组的最后一个值 返回这个数值,原数组则减少这个值
shift() //从头普取出一个
unshift(1,2,3,4) //从头部插入一个
concat () //连接两个数组,返回新的数组,不会更改原数组
slice(2,5) 从第2位取到底5位
splice (1,1) 从第2个开始删 1个
splice(1,0,333,444) 插入
出入函数作为参数
every() //循环数组每一项 都返回true 则返回true
some() //循环数组每一项 一个返回true 则返回true
forEach() // 组成数组再返回
filter() //找出符合函数条件的 组成数组返回来
map() // 运算后,组成数组饭回来
reduce( function(prev,cau,index,arr){}) //
reduceRight()
创建Web服务器和TCP服务器
使用http模块创建Web服务器
Express服务器:
路由:将不同的请求,分配给相应的处理函数;区分:路径、请求方法
三种路由法方法:
1 path
2 Router 定义一组 子路由
var Router = express.Router(); Router.get('/add',function(req,res){ res.end('Router /add '); }); Router.get('/list',function(req,res){ res.end(Router /list '); });
qpp.use('/post',Router);
3 route
app.route('/article').get(function(req,res){ res.end('route /article getm');}) .post(function(req,res){ res.end('route /article post '); });
jikexueyuan
严格模式的使用:"use strict" 1在整个脚本中,2 在函数中;
语句:label语句:
1 outter:for(var i=0;i<3;i++){ 2 inner:for(var j=0;j<2;j++){ 3 console.log('i:',i,'j:',j); 4 if(i ===1){ 5 break outter; 6 } 7 } 8 }
对象属性:
arguments直接读取对象;
arguments.length 读取对象长度;
arguments[0] 读取对象的索引为0的值;
function testArg(){ console.log('argument:',arguments); console.log('argument count:',arguments.length); console.log('first argument:;,arguments[0]); } testArg(1,2,3,4);
eval('console.log("this is eval")') //this is eval 将字符串转换成执行环境 但是不推荐,执行时间和调试及安全问题
url部分:protocol协议:http ;slashes:是否使用双斜杠;host 域名;port:端口;hostname:主机名;hash:锚点;query:发送给服务器的数据;path:路径;href:
url.parse('路径') //解析成URL对象
url.format({url对象}) //合成路径
url.resolve('url路径','url路径') //合并路径
序列化对象:querystring.stringify({...},''/',') //将对象序列化成 以&或,连接的字符串
反序列化字符串:querystring.parse('',',') //将字符串反序列化为对象,
http:
get/request http.request(options[,callback])
mongodb 特点;
1 使用BSON存储数据
2 支持相对丰富的查询操作
3 支持索引
4 副本集
5 分片
6 无模式
7 部署简单方便
启动:
参考https://cnodejs.org/topic/581b0c4ebb9452c9052e7acb node.js中文简介
http://justsee.iteye.com/blog/1570652 session详解与cookie
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,
cookie的内容主要包括:名字,值,过期时间,路径和域。 路径和域一起就构成了cookie的作用范围。
会话cookie:如果不设置过期时间,则表示其生命周期为浏览器会话其间,只要关闭浏览器,cookie就消失了。一般保存在内存中。
如果设置了过期时间,浏览器会把cookie保存到硬盘上,再次打开浏览器cookie仍然有效
session机制:是一种服务器端机制,服务器使用一种类似于散列表的结构来保存信息。
当程序为某个客户端请求创建一个session的时候,服务器首先检查这个客户端请求里是否已经包含了一个session id ,若有,说明创建过,服务器会按照此session id将此session检索出来使用;如果客户端请求中不包含session id ,就会创建一个session 并生成一个唯一且不易被找到规律以仿造的 session id存到客户端cookie中。保存在硬盘上,就会再次找到此session id。所以关闭浏览器不会导致session被删除。
http://www.ruanyifeng.com/blog/2014/05/restful_api.html restful 解释
测试性能:命令行运行 ab -c1000 -n10 http://www.xxxx.com/