Express.js中文文档-模块结构、顶层函数

 2016年03月12日    605     声明


Express 是一个基于 Node.js 平台开发的,简单、灵活的 Web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。Express提供了丰富的 HTTP 快捷方法和任意排列组合的中间件,使你可以快速、简单的创建一个健壮的API。Express性能优异,它没有对 Node.js 已有的特性进行二次抽象,只是在它的基础上扩展了 Web 应用所需的基本功能。


  1. 关于本文档
  2. Express模块结构
  3. 顶层函数

1. 关于本文档

本文档参考Express 官方4.x API文档完成,但不会完整翻译官方文档。本站会在官方文档的基础上进行适当取舍,对于使用较多、比较有用的API会着重介绍并配以示例说明。

参照官方文档结构,本系列文档预计会分为5篇,分别会介绍:顶层函数Application对象、Request对象、Response对象、Router对象。这些对象是Express开放给用户访问的对象,与Express模块结构有关,Express所有的API都是通过这些对象暴露给用户的。

Express.js中文文档系列索引如下:


2. Express模块结构

创建一个Express应用或下载文档示例,并在项目文件夹通过npm install命令安装项目依赖文件后,NPM会在项目中创建./node_modules文件夹,其中就包含express模块。express模块通过./node_modules/express/lib/express.js文件向用户开放了对象及API的访问,Express所有功能都是从这个文件开始的。

工厂函数

/**
 * 导出工厂函数 `createApplication()`
 */

exports = module.exports = createApplication;

createApplication()用于创建Express应用,它会返回一个Application对象实例。在Express应用的app.js文件中创建应用的代码,其本质上是调用了createApplication()函数。


原型链对象

/**
 * 导出原型链对象
 */

exports.application = proto;
exports.request = req;
exports.response = res;

requestresponse是Express分别对 Node.js HTTP模块中IncomingMessageServerResponse对象的封装,而application是Express的Application对象。


构造函数

/**
 * 导出构造函数
 */

exports.Route = Route;
exports.Router = Router;

RouteRouter是两个构造函数。Router创建的对象是路由构造器实例,它提供了对Route对象实例的访问,而Route对象实例提供了创建具体路由路径时的事务处理。


中间件

/**
 * 导出中间件
 */

exports.query = require('./middleware/query');
exports.static = require('serve-static');

这两个中间件分别用于处理URL查询字符串,和设置服务器的静态资源目录。query在处理在application内部被自动设置,而staticapp.js中需要设置静态资源时引入。


3. 顶层函数

3.1 创建应用:express()

express()

创建一个Experss应用。express()方法是expres模块导出的一个顶层函数。

var express = require('express');
var app = express();


下面是expres模块导出一些静态方法,这些方法不需要创建应用实例,可以通过模块引用直接调用。


3.2 静态资源中间件:static()

express.static(root, [options])

static()是唯一一个Express内置的中间件,基于serve-static模块构建,用于设置服务器的静态资源目录。

  • root,静态资源的根目录
  • options,可选参数对象,其值如下:
    • dotfiles:{String}。是否可访问服务器的点文件('.'开头的文件或目录),可选值有allowdenyignore,默认值ignore
    • etag:{Boolean}。启用或关闭Etag生成,默认为true
    • extensions:{Boolean}。设置文件扩展名回退:如果找不到文件,则会按扩展名查询并返回查找到的第一个结果,默认为false
    • fallthrough:{Boolean}。遇到客户端不能处理的请求时,是否传递客户端错误,默认为true
    • index:{Mixed}。设置目录的主页文件,默认为index.html
    • index:{Boolean}。设置是否在响应中添加Last-Modified信息头,默认为true
    • maxAge:{Number}。设置是响应头中Cache-Control的缓存时间长度(max-age属笥),默认为0
    • redirect:{Boolean}。设置如果访问路径是一个目录,是否重定向到根目录'/',默认为true
    • setHeaders:{Function}。用于设置响应文件 HTTP头信息,函数参数为:fn(res, path, stat)

在Express应用的app.js文件中,就默认将'public'目录设置为静态资源目录,设置后客户端就可以直接访问这个文件夹中的文件,而不需要在映射路由处理:

app.use(express.static(path.join(__dirname, 'public')));


3.3 创建路由对象:Router()

var router = express.Router([options]);

创建一个router对象。

options是一个可选参数,其值如下:

  • caseSensitive:{Boolean}。是否大小写敏感。默认为false,即:'/Foo''/foo'是同一个路径
  • mergeParams:{Boolean}。是否合并req.params值。为ture时,如果父路由与子路由中有同名参数,将使用子路由中参值。默认为false。这个参数在v4.5.0+中可用
  • strict:{Boolean}。是否使用严格路径。为ture时,'/foo''/foo/'不是一个路径。默认为false

我们可以通Router()向Express应用中添加路由处理,并可以针对不同的HTTP请求方式添加不同或相同的处理,而且可以像添加应用中间件一样添加路由中间件。如:

var express = require('express');
var router = express.Router();

/* GET 请求应用主页 */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});