Node.js编程基础
- Node.js的目的是提供简单高效的底层API,把其他处理逻辑留给第三方框架。
模块系统
- 模块系统:避免了对全局作用域的污染,也就避免了命名冲突,并简化了代码的重用。
- 模块既可能是一个文件,也可能是包含一个或多个文件的目录。
- 允许从被引入的文件中选择要暴露给程序的函数和变量。
- 设定exports对象的属性来指明模块返回的多个函数或变量;设定module.exports属性指定只返回一个函数或变量。
- 使用模块需要调用require函数,该函数以模块的路径为参数。Node以同步的方式定位并加载它。


异步编程
- 回调:通常用来定义一次性响应的逻辑。它是一个函数,被当做参数传给异步函数,描述了异步操作完成之后要做什么。
- 事件监听器:通常用来定义处理重复性事件的逻辑。是与一个事件相关联的回调。
- 事件发射器:一个可以被继承、能够添加事件发射及处理能力的类。一个Node HTTP服务器实例就是一个事件发射器。
- 串行流程控制:把任务按预期的执行顺序放到一个数组中。这个数组将起到队列的作用,完成一个任务后按顺序从数组中取出下一个。
- 工具:Nimble、Step、Seq
- 并行流程控制:把任务放到数组中,但任务的存放顺序无关紧要。每个任务都应该调用处理器函数增加已完成任务的计数值。当所有任务都完成后,处理器函数应该执行后续的逻辑。
Web应用
Node HTTP服务器

RESTful Web服务
- 创建标准的REST服务器需要实现四个HTTP谓词。每个谓词会覆盖一个待办事项清单的操作任务:
- POST:向待办事项清单中添加事项。
- GET:显示当前事项列表,或者显示某一事项的详情。
- DELETE:从待办事项清单中移除事项。
- PUT:修改已有事项。
- 提供静态文件服务:
Connect
- Connect是一个框架,它使用被称为中间件的模块化组件,以可重用的方式实现Web程序中的逻辑。
- 中间件组件:是一个函数,它拦截HTTP服务器提供的请求和响应对象,执行逻辑,然后或者结束响应,或者把它传递给下一个中间件组件。
- 分派器:用于把中间件“连接”在一起。
- Express框架就是基于Connect框架构建的。

- 工作机制:中间件组件是一个JavaScript函数,它会接受三个参数,一个请求对象,一个响应对象,还有一个通常命名为next的参数,它是一个回调函数,表明这个组件已经完成了它的工作,可以执行下一个中间件组件了。

- Connect自带中间件:
组件 | 描述 |
---|---|
cookieParser() | 为后续中间件提供req.cookies和req.signedCookies |
bodyParser() | 为后续中间件提供req.body 和 req.files |
limit() | 基于给定字节长度限制请求主体的大小。必须用在bodyParser中间件之前 |
query() | 为后续中间件提供req.query |
logger() | 将HTTP请求的信息输出到stdout或日志文件之类的流中 |
favicon() | 响应 /favicon.ico HTTP 请求。通常放在中间件logger前面,这样它就不会出现在你的日志文件中了 |
methodOverride() | 可以替不能使用正确请求方法的浏览器仿造req.method,依赖于bodyParser |
vhost() | 根据指定的主机名(比如nodejs.org)使用给定的中间件和/或HTTP服务器实例 |
session() | 为用户设置一个HTTP会话,并提供一个可以跨越请求的持久化req.session对象。依赖于cookieParser |
basicAuth() | 为程序提供HTTP基本认证 |
csrf() | 防止HTTP表单中的跨站请求伪造攻击,依赖于session |
errorHandler() | 当出现错误时把堆栈跟踪信息返回给客户端。在开发时很实用,不过不要用在生产环境中 |
static() | 把指定目录中的文件发给HTTP客户端。跟Connect的挂载功能配合得很好 |
compress() | 用gzip压缩优化HTTP响应 |
directory() | 为HTTP客户端提供目录清单服务,基于客户端的Accept请求头(普通文本,JSON或HTML)提供经过优化的结果 |
Express
- 配置:由环境变量NODE_ENV驱动的5个方法。
- app.configure():接受一个表示环境的可选字符串,以及一个函数。当环境与传入的字符串相匹配时,回调函数会被立即调用;当只给出函数时,在所有环境中都会调用它。
- app.set():分配给name一个value,并将name作为settings的一个属性。
- app.get():获得通过app.set()设置的值。
- app.enable():相当于set(name, true)。
- app.disable():相当于set(name, false)。
- 渲染视图:把数据传给视图,然后数据会被转换,通常是变成Web程序中的HTML。在程序层面用app.render(),在请求或响应层面用res.render(),直接传给res.render()的值优先级要高于通过res.locals和app.locals设定的值。
- Express默认只会向视图中输出一个程序级变量,settings,这个对象中包含所有用app.set()设定的值。
// 1. 改变查找目录:
// Node中的__dirname(前面有两个下划线)是一个全局变量,用来确定当前运行的文件所在的目录。
app.set('views', __dirname + '/views');
// 2. 设置默认查找引擎
app.set('view engine', 'jade');
// 3. 默认启用视图缓存
// 在view cache被禁用时,每次请求都会从硬盘上读取模板。在view cache被启用时,每个模板只会读取一次硬盘。
app.enable('view cache');
- 视图的查找流程:

Web程序模板
- MVC:
- 常见模板引擎:
- Embedded JavaScript(EJS)引擎
- 遵循极简主义的Hogan引擎
- Jade模板引擎