Node编程基础
-
Node.js是什么
- 一个搭建在Chrome Javascript运行时上的平台,用于构建高速、可伸缩的网络程序
- 采用事件驱动、非阻塞I/O模型,轻量&高效,成为构建运行在分布式设备上的数据密集型实时程序的完美选择
-
异步编程技术
-
Node里两种响应逻辑管理方式
- 回调:定义一次性响应逻辑,比如数据库查询,指定一个回调确定如何处理查询结果
- 事件监听:本质上是回调,但和一个事件相关联;比如HTTP请求事件,可以监听并添加响应逻辑
-
Node HTTP服务器实例就是一个事件发射器,一个可以继承、添加事件发射及处理能力的类(EventEmitter),Node很多功能都继承自EventEmitter
-
如何用回调处理一次性事件
- 回调定义:是一个函数,作为参数传给异步函数,描述了异步操作之后要做什么
- 减少嵌套:可以把每一层回调嵌套处理作为命名函数,还可以if尽早return减少嵌套
-
如何用事件监听器响应重复性事件
-
比如socket.on(’data’, function() {xxx})
-
响应一次:如socket.once(’data’, function() {xxx})
-
创建事件发射器
var EventEmitter = require('events').EventEmitter; var channel = new EventEmitter(); channel.on('join', function() {xx}); // 触发 channel.emit('join')
-
-
异步编程难点
-
程序的执行流程
-
程序的状态:事件轮询的条件、程序变量、以及随着程序逻辑执行而发生的变化的资源
- node的事件轮询会跟踪还没有完成的异步逻辑,只要有未完成的异步逻辑,Node进程就不会退出
-
异步逻辑的顺序化:
-
流程控制:让一组异步任务顺序执行
- 串行:需要一个接着一个做
- 并行:不需要一个接着一个做,任务彼此间的开始和结束时间并不重要,但在后续逻辑执行之前他们应该全部做完。
-
跟踪串行/并行的流程控制,需要编程记账
-
串行:需要跟踪当前执行的任务,或者维护一个尚未执行任务的队列
-
并行:需要跟踪有多少个任务要执行完成了
-
串行化流程控制的工作机制:
- 按预期的顺序存在数组中的任务,数组起到队列的作用,完成一个任务后按顺序从数组中取出下一个
- 串行化流程控制的本质,是在需要时让回调进场,而不是简单把他们嵌套起来
-
并行化流程控制:
- 为了让异步任务并行执行,仍要把任务放到数组中,但存放顺序不重要。每个任务都应调用处理器函数增加已完成任务的计数值。当所有任务都完成后,处理器应执行后续逻辑。
-
社区中的流程控制工具:
- Nimble,改善代码可读性,避开回调嵌套
- Step
- Seq
-
-
-
存储Node程序中的数据
-
存储数据而无需安装和配置DBMS
-
内存存储:存放少量经常使用的数据,比如重启服务器后页面访问次数的计数器
-
基于文件的存储
- 用文件系统,可以持久化保存,但对于多用户程序,可能有并发问题(同时修改文件),应选择数据库管理系统
-
-
关系型数据库(MySQL和PostgreSQL)
-
用NoSQL数据库(意思为No SQL或者Not only SQL,如 Redis、MongoDB、Mongoose)
-
关系型DBMS为可靠性牺牲性能,但很多NoSQL将性能放在第一位。
-
对于实时分析或消息传递而言,NoSQL数据库是更好的选择,无需预先定义数据的schema,对于那种要把数据存储在层次结构中,但层次结构会发生变化的程序而言,很有帮助
-
Redis
-
适合处理那些不需要长期访问的简单数据存储,比如短信和游戏中的数据
-
Redis把数据存在RAM中,并在磁盘中记录数据变化
-
缺点是存储空间有限
-
好处是数据操作很快
-
如果Redis服务器崩溃,RAM中的内容丢失了,可以用磁盘中的日志恢复数据
-
支持的数据结构:哈希表、链表、键/值对(作为简单变量使用)、集合(Set)
-
用信道传递数据
- 信道是数据传递机制,提供发布/预定功能
- Redis客户端可向任一给定的信道预定或发布消息
- 预定一个信道意味着你会收到所有发送给它的消息
- 发布给信道的消息会发送给所有预定了那个信道的客户端
-
NODE_REDIS性能最大化
- 准备将使用了node_redis API的Node.js程序部署到生产环境时,可考虑是否使用hiredis模块,该模块会显著提高redis性能
-
-
MongoDB
- 把文档存在集合(collection)中,集合中的文档不需要相同schema,每个文档都可以有不同的schema
-
Mongoose
- 帮助顺畅使用MongoDB,Mongoose的模型(模型-视图-控制器)提供了一个到MongoDB的集合接口,和实用的功能。比如schema层次结构,中间件以及数据校验。
-
-
Connect
-
Connect
- 是一个框架,它使用被称为中间件的模块化组件,以可重用的方式实现Web程序中的逻辑
- Connect用分派器把中间件“连接”在一起
-
中间件
-
顺序很重要
-
用函数返回另一个函数(闭包)
-
Connect自带的中间件
- 会话管理
- cookie解析
- 请求主体解析
- 请求日志
- cookieParser、bodyParser、limit、query、logger、favicon、methodOverride、vhost、session、basicAuth、csrf、errorHandler、static、compress、directory
-