| nodeJS
|
| buffer: 处理二进制, 对字符串与二进制进行转换 (done)
| fs: 文件系统操作 (done)
| http: 处理http请求, 创建服务器, 和处理客户端与服务器之间的数据传递request、response (done)
| stream: 文件流
| path: 文件路径的处理 (done)
| URL: 网络地址解析 (done)
| querystring: URL查询字符串 (done)
| Cookie、Session、Token (done)
| event: 事件机制
|
| DNS: 域名解析
| net: TCP网络
| dgram: UDP网络
| crypto: 数据加密
| process: 进程
| childe_process: 子进程
| cluster: 集群
| global: 全局
|
| Express
| Template 模板 jade、
| Mysql (done)
| MongoDB
| redis
| RESTful 架构
|

安装

优点:
    前端的局限性,可以对文件、进程、数据库等进操作,是一门纯后端
    处理高并发  程序异步执行不会阻塞

缺点: nodejs是单线程

1、nodeJS安装,mac或windows系统需要到官网下载安装包,自带npm包管理器

2、安装express框架:npm install -g express

        $ express       // 执行命令

3、更新node版本

    node需要下载一个n模块,是用来专门管理nodejs的版本

    $ sudo npm install -g n     # 安装n模块

    $ sudo n stable        # 升级到稳定版,也可以指定版本号 n v0.10.26

        sudo n 8.9.4        # 升级到指定版本


4、其它命令

    npm -v                  # 显示版本,检查npm 是否正确安装。

    npm install express      # 安装express模块

    npm install -g express  # 全局安装express模块

    npm list                 # 列出已安装模块

    npm show express         # 显示模块详情

    npm update                # 升级当前目录下的项目的所有模块

    npm update express        # 升级当前目录下的项目的指定模块

    npm update -g express      # 升级全局安装的express模块

    npm uninstall express      # 删除指定的模块

NPM与包

NodeJS以CommonJS的包规范来制订,由包结构和包描述文件两部分组件

1、包结构

    npm 下载完包存储到 node_modules 目录中,包含:

    1)package.json: 包描述

    2)bin: 存放可执行的二进制文件

    3)lib: 存储javascript代码目录

    4)doc: 用于存放文档的目录

    5)test: 存放单元测试用例代码

NodeJS

Node采用了Google的V8引擎,作为javascript语言的解释器,Node是基于事件驱动和异步I/O的服务器环境

1、JS与node的区别

    1)JS中顶层对象是 window,nodeJS中的顶层对象是 global

    2)JS中 var a = 10; window.a; 可以访问到,但在node中global.a是访问不到的,因为node有模块的概念

        node中一个文件就是珍上模块,每个模块有自己的作用域

2、REPL环境

    在命令行输入node, 可以直接运行node命令

模块系统 require、exports

1、模块分为

    模块加载:require('2.js');

    1)内置模块:  var fs = require('fs');        // 加载Node的内置模块 fs文件系统

    2)文件模块: 自己定义的业务模块

        定义一个food.common.js

        var food = reuqire('./js/food.common');        // 加载业务模块

    3)加载第三方模块

        require('./2');        // 先按照加载的模块文件进行查找,如果没有找到会在文件名加上.js


2、绝对和相对路径

    var fs = require('fs');        // 绝对路径,是在Node通过内部的node_modules查找到的模块

    var moduleA = reuqire('./lib/moduleA');        // 相对路径


2、npm 全局安装和局部安装

    1)全局安装会安装到Node目录中,各项目都可以使用 npm install -g gulp

    2)局部安装,将一个模块安装到node_modules中,只在当前和子目录中使用


3、模块化

    module和exports两个全局变量

    1)module:每个模块下都包括module对象

        Module {
            id: '.',
            exports: {},
            parent: null,
            filename: '/Users/apple/siguang.liu/nodeProject/server.js',
            loaded: false,
            children: [],
            paths: [
                '/Users/apple/siguang.liu/nodeProject/node_modules',
                '/Users/apple/siguang.liu/node_modules',
                '/Users/apple/node_modules',
                '/Users/node_modules',
                '/node_modules'
            ]
         }

     2)exports外部接口,通过require就可以调用这个接口

         其实exports就是module.exports的引用

        exports.name = 'siguang';
        exports.getPrivate = function(){
            return 'haha';
        }

事件 EventEmitter

var EventEmitter = require('events').EventEmitter,
    a = new EventEmitter;

a.on('event', function(){
    console.log('event called');
})
a.emit('event');

—————————- Node API 文档 —————————-

process 进程对象

1、pid:进程id,也就是进程名

2、kill(pid):杀掉进程

3、nextTick(callback): 会在第一次事件环中最末尾执行,setTimeout和setImmediate属于第二事件环

    console.log('开始');

    setImmediate(function(){
        console.log('setImmediate')
    });

    setTimeout(function(){
        console.log('setTimeout');
    }, 0);

    process.nextTick(function(){
        console.log('nextTick');
    })

    console.log('结束');


    output:

        ---------------  第一次 ----------------
        开始
        结束
        nextTick

        ---------------  第二次 ----------------
        setTimeout
        setImmediate

TCP

传输控制协议TCP是一个面向连接的协议,保证两台计算机之间数据传输的可靠性和顺序

它可以将数据从一台计算机完整有序的传到另一台计算机,http模块就是继承了net(TCP)模块

var net = require('net');        // 引用TCP模块

telnet系统嵌套的客户端,端口23, 用来连接服务器

退出TCP连接 alt+[, 退出telnet quit命令

connect

基于HTTP服务器的工具, 提供新的组织代码的方式来与请求响应对象进行交互,称为中间件

引用模块 var connect = require('connect');

connect作用: 

    1、托管静态文件

    2、处理错误及不存在的url

    3、处理不同类型的请求

utils 工具

var utils = reuqire('utils');

Events 事件

EventEmitter 类

var EventEmitter = require('events');
var emitter = new EventEmitter();

1、addListener(event, listener): 创建事件,客户端通过事件来调用,而服务端通过代码来调用事件侦听

       on(event, listener):

       //  addListener 事件
    var EventEmitter = require('events').EventEmitter;
    var emitter = new EventEmitter();

    emitter.addListener('some_events', function(foo, bar){
        console.log(foo, bar);
    })

    emitter.emit('some_events', 'helloA', 'world');         // helloA world
    emitter.emit('some_events', 'helloB', 'world');         // helloB world


    // on 可以
    emitter.on('message', function(mes, name, age){
        console.log(mes +" name:"+ name +" age:"+ age);
    })

    emitter.emit('message', '消息1', 'siguang', '32');       // 消息1 name:siguang age:32
    emitter.emit('message', '消息2', 'lulu', '30');          // 消息2 name:lulu age:30


2、once():只执行一次

    emitter.once('onceEvent', function(age){
        console.log(age);
    })

    emitter.emit('onceEvent', '1');        // 只执行此次事件
    emitter.emit('onceEvent', '2');
    emitter.emit('onceEvent', '3');


3、removeListener(): 删除listener

4、removeAllListeners(): 删除所有

5、setMaxListeners(num): 正常事件的个数为10个, 如果超出通过此方法来改变限制的个数

6、setMaxListeners(): 每个emitter实例的最大监听数

7、listeners(event): 返回指琮事件的数组

8、emit(事件名, 参数): 执行事件

9、listenerCount(emitter, event): 返回事件个数
https://cnodejs.org/topic/55f8d70a20d84f3d377582a3

1、cookie和session的区别

    cookie存放在客户端 session存放到服务器上

    cookie不安全,客户端可以修改, session不会被修改

    session会保存在一定时间内保存在服务器端, 当访问增多, 会影响性能


2、cookie

    存储到客户端的信息

3、session

    # npm install express-session --save       // 安装

    session原理

        1)服务器端有一个对象专门存session的对象或库 如sessions={};

        2)通过req.session.sign来检查是否为已登录状态

        3)如果没有登录,第一次访问会生成一个sid,Date.now()+Math.random(); 将sid存储到sessions中

        4)把这个sid发送到浏览器端, 通过请求头中会有一个set-cookie, 将session中存到cookie中

            set-cookie:connect.sid=s%3AjDb0ns6Ekas3I7ll3tm9Bxg_wd4WjBJY.wL8VyIWdHQNFWt%2ByE%2BjAV30r4M7ZQdVIXgeKBOzx5iY; Path=/; Expires=Fri, 25 Nov 2016 03:27:38 GMT; HttpOnly

            HttpOnly 不能读不能写


    session(options): 选项内容

        1)name: session名称,设置cookie中,默认为connect.sid

        2)stroe: session存储方式,默认存在内存中,也可以存储到redis、mongodb

        3)secret: 通过设置secret字符串,来计算hash值并放在cookie产生的signedCookie防篡改

        4) cookie: 存放session id 的cookie

        5) genid: 产生一个新的session_id时,所使用的函数,默认使用uid2这个npm包

        6)rolling: 每个请求都重新设置一个cookie

        7)resave: 即使session没有被修改也保存session值

        8)saveUnintialized: 保存新创建但未修改的session


    示例:

        router.get('/', function (req, res) {

            if (req.session.sign) { // 检查用户是否已经登录
                console.log(req.session);//打印session的值
                res.send('welecome <strong>' + req.session.name + '</strong>, 欢迎你再次登录');
            }
            else {      // 否则展示index页面
                req.session.sign = true;
                req.session.name = 'haha';
                res.end('欢迎登陆!');
            }

        });

webSocket

轮循: 隔多长时间ajax发一次请求, 不间隔的去发

长轮循: 隔多长时间ajax发一次请求,接到结果后在发出下一次请求


webScoket: 长连接,浏览器和服务器只需要一次握手,浏览器就和服务器形成一个快速通道,两者之间相互传送数据

    1、节省资源: Header只有2 Bytes,1字节8位   1kb = 1024 bytes

    2、推送消息: 不需要客户端发请求


1、安装

    # npm install ws

2、socket.io库

    Socket.IO是websocket库,包括客户端的js和服务器端的nodejs,目标是构建可以在不同浏览器和移动设备上使用实时应用.

    # npm install socket.io


    https://www.zhihu.com/question/20831000         // scoketIO最大连接数和并发数

错误处理

1、同步方法 try catch

2、异步 判断回调函数error对象

3、流里判断错误,监听error事件

    rs.on('error', function(error){
        console.log(error);
    })

http协议

content-type 的一些参数值: http://blog.csdn.net/blueheart20/article/details/45174399

request请求头: 客户端请求服务器的请求头

    1、host: 主机地址

    2、connection: 客户端与服务器的连接选项

    3、accept: 服务器处理内容的优先级, q是权重 0-1之间范围

    4、user-agent: 用户代理,发送浏览器的硬件、系统等信息, 可以通过些选择来收集用户的pc端还是moblie端访问的多少

    5、accept-encoding: 告诉服务器所支持的编码

    6、accept-language: 告诉服务器所使用的语言, 用于判断中文站还是英文站


response响应: 服务器向客户端响应

    1、statusCode: 状态码

    2、resonPhrase: 状态码描述

    3、headers: 响应头信息

        1) content-Type: 内容类型

        2) location: 重定向url

        3) content-disposition: 下载文件名

        4) content-length: 响应内容的字节数

        5) set-cookie: 写入客户端cookie

        6) content-encoding: 响应内容编码

        7) cache-Control: 缓存

        8) Expires: 指定缓存过期时间

        9) Etag: 服务器响应内容没有变化重新下载数据

        10) connection: 默认keep-alive 保持连接,断开使用close

参考资料

https://thinkjs.org/
https://chyingp.gitbooks.io/nodejs/content/%E8%BF%9B%E9%98%B6/%E5%9B%BE%E7%89%87%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%88%90datauri.html ***
http://nodeapi.ucdok.com/api/ // API中文文档
https://github.com/wangxueliang/node-api/blob/master/doc/fs.md API中文部分
https://nodejs.xiangfa.org/documentation/ // API中文文档
https://cnodejs.org/getstart // node入门
http://nqdeng.github.io/7-days-nodejs/
http://cnodejs.org/topic/581b0c4ebb9452c9052e7acb
http://nqdeng.github.io/7-days-nodejs/ // 7天会Node
https://www.gitbook.com/@chyingp
http://cnodejs.org/topic/581b0c4ebb9452c9052e7acb
https://cnodejs.org/topic/56ef3edd532839c33a99d00e
https://github.com/leizongmin/node123 // 资料导航

Express框架

http://www.expressjs.com.cn/starter/hello-world.html
https://github.com/expressjs?page=2 express下的插件
https://github.com/nodejs nodeJS插件

插件:

http://node.zhufengpeixun.cn/
https://github.com/node-modules?page=1

https://github.com/keepfool/node-lessons

1、cookie: https://github.com/expressjs/cookie-parser // cookie-parser

http://www.cnblogs.com/coolicer/p/4191548.html

2、express-session: session的处理

3、cookie、sesssion加密的包 cookie-signature: https://github.com/visionmedia/node-cookie-signature

https://segmentfault.com/q/1010000000392851

4、token: express-jwt https://www.npmjs.com/package/express-jwt

http://ninghao.net/blog/2834

5、socket.io: npm install socket.io https://github.com/socketio/socket.io

2、mysql: https://www.npmjs.com/package/mysql // 连接和处理mysql

3、ws安装socket/IO服务包: npm install ws

4、mime: https://github.com/broofa/node-mime // 响应css、js文件的请求

http://blog.csdn.net/zgljl2012/article/details/44700953

5、body-parser: https://github.com/expressjs/body-parser // json

https://segmentfault.com/a/1190000003061925

6、superagent: http://visionmedia.github.io/superagent/

http://www.codesec.net/view/183926.html

7、node-images: https://github.com/zhangyuanwei/node-images // 图片转换

8、node-xlsx: https://github.com/mgcrea/node-xlsx // 处理xlsx文件

9、multer: https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md // 处理文件上传

req.body存储表单内容

req.file存储上传控制的内容

multer({dest: './public/upfile'});    设置图片文件存储的路径

upload.single('sendUpfile');        // 上传单个文件 file的name="sendUpfile"

11、multiparty 文件上传: https://github.com/expressjs/node-multiparty

10、formidable: https://cnodejs.org/topic/4f5c62932373009b5c0b027b // 文件上传

11、up工具用于重启服务器, 每次代码修改不需要重启服务器,通过up来完成

安装 sudo npm install up -g

运行 到项目目录 up -watch -port 8080 server.js

模板:

1、handlebars http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html

http://www.ghostchina.com/introducing-the-handlebars-js-templating-engine/
hbs:  http://www.cnblogs.com/chyingp/p/hbs-getting-started.html

1、Jade

2、ejs

3、Haml

4、CoffeeKup

MD5 JS https://github.com/blueimp/JavaScript-MD5

HTML5 new FormData() http://www.cnblogs.com/lhb25/p/html5-formdata-tutorials.html