node.js基础

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/

原文地址:https://www.cnblogs.com/yxiaoqian/p/5809323.html