个人博客

A web front-end programmer's personal blog.

Express API 测试用例整理(一)

Express API 翻译版本点击这里,本文主要对一些方法提供简单的示例,帮助理解使用。

###Application部分

####express()

创建一个express应用程序

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

app.get('/', function(req, res){
  res.send('hello world');
});

app.listen(3000);

app.set与app.get

分别为设置获取值

app.get('title'); //undefined
app.set('title', 'My Site');
app.get('title'); // My Site

####app.enable与app.disable

开启和关闭

app.enable('trust proxy');
app.get('trust proxy'); // true
app.disable('trust proxy');
app.get('trust proxy'); //false

####app.enabled与app.disabled

检查是否设置开启和关闭

app.enabled('trust proxy'); // => false
app.enable('trust proxy');
app.enabled('trust proxy');// => true

app.disabled('trust proxy');// => true
app.enable('trust proxy');
app.disabled('trust proxy');// => false

####app.use

使用中间件

var express = require('express');
var app = express();
// 一个简单的 logger
app.use(function(req, res, next){
  console.log('%s %s', req.method, req.url); // GET /URL
  next();
});
// 响应
app.use(function(req, res, next){
  res.send('Hello World');
});
app.listen(3000);

使用 app.use() “定义的”中间件的顺序非常重要,它们将会顺序执行,use的先后顺序决定了中间件的优先级。

####settings配置

下面的内建的可以改变Express行为的设置

  • env ,运行时环境,默认为 process.env.NODE_ENV 或者 “development”
  • trust proxy, 激活反向代理,默认未激活状态
  • jsonp callback name ,修改默认?callback=的jsonp回调的名字
  • json replacer ,JSON replacer 替换时的回调, 默认为null
  • json spaces, JSON 响应的空格数量,开发环境下是2 , 生产环境是0
  • case sensitive routing, 路由的大小写敏感, 默认是关闭状态, “/Foo” 和”/foo” 是一样的
  • strict routing 路由的严格格式, 默认情况下 “/foo” 和 “/foo/” 是被同样对待的
  • view cache 模板缓存,在生产环境中是默认开启的
  • view engine 模板引擎
  • views 模板的目录, 默认是”process.cwd() + ./views”

示例:

	app.set('views','./views');
	app.set('view engine','jade');

####app.param

路由参数的处理逻辑。比如当 :user 出现在一个路由路径中,你也许会自动载入加载用户的逻辑,并把它放置到 req.user , 或者校验一下输入的参数是否正确。

// example1
var express = require('express');
var app = express();
app.param('id', function(req, res, next,id){
  console.log('url参数为:'+id); //对一些特别的用户进行相应的处理
  next();
});
app.get('/user/:id',function(req,res){
	console.log(req.url);
	res.send('hello world');
});
app.listen(3000);

//example2
var express = require('express');
var app = express();
app.param('range', function(req, res, next,range){
	var re = /^(\w+)\.\.(\w+)?$/;
	if(re.test(range)){  //只有符合正则的才能进入下一步
		next();
	}else{
		console.log('error range');
	}
});
app.get('/range/:range',function(req,res){
	var range = req.params.range;
	console.log(typeof range);
	res.send('hello world');
});
app.listen(3000);

####app.VERB

app.VERB() 方法为Express提供路由方法, VERB 是指某一个HTTP 动作, 比如 app.post()。 可以提供多个callbacks,这多个callbacks都将会被平等对待 ,它们的行为跟中间件一样,也有一个例外的情况,如果某一个callback执行了next(‘route’),它后面的callback就被忽略。这种情形会应用在当满足一个路由前缀,但是不需要处理这个路由,于是把它向后传递。

app.VERB应该是一类的总称:如 app.get、app.post、app.put、app.delete等等,并不是app示例的一个真实存在的方法。

var app = express();
console.log(app.VERB); // undefined

####app.all

该方法就好像标准的 app.METHOD()方法,除了它匹配所有的http请求。这个方法在给特定前缀路径或者任意路径上处理时会特别有用。 比如你想把一个路由放在所有其它路由之前,处理一些加载验证或用户处理等,然后通过next去匹配执行下个路由。

var express = require('express');
var app = express();
app.all('*',function(req,res,next){
	console.log('所有的请求都要走这里');
	next();
});
app.get('/',function(req,res){
	res.send('来着首页的请求');
});
app.get('/page',function(req,res){
	res.send('来着分页的请求');
});
app.listen(3000);

####app.locals

应用程序本地变量会附加给所有的在这个应用程序内渲染的模板。 这是一个非常有用的模板函数,就像应用程序级数据一样。app.locals 对象是一个JavaScript Function, 执行的时候它会把属性合并到它自身,提供了一种简单展示已有对象作为本地变量的方法

//example1
app.locals.title = 'My App';
app.locals.strftime = require('strftime');
app.locals.email = 'me@myapp.com';

app.locals.title // => 'My App'
app.locals.email// => 'me@myapp.com'

####app.render

渲染 view, callback 用来处理返回的渲染后的字符串。 这个是 res.render() 的应用程序级版本,它们的行为是一样的。

app.render('email', function(err, html){
  // ...
});
app.render('email', { name: 'Tobi' }, function(err, html){
  // ...
});

####app.route

app.route 对象存储了所有的被HTTP verb定义路由。 这个对象可以用在一些内部功能上,比如Express不仅用它来做路由分发,同时在没有app.options()定义的情况下用它来处理默认的OPTIONS行为。 你的应用程序或者框架也可以很轻松的通过在这个对象里移除路由来达到删除路由的目的。

var app = express();
app.route('/events')
.all(function(req, res, next) {
  console.log('all');
  next();
})
.get(function(req, res, next) {
  console.log('get');
  res.send('hello get');
})
.post(function(req, res, next) {
  console.log('post');
  res.send('hello post');
})

####app.mountpath

app.mountpath属性是挂载的子应用程序的路径模式。

var express = require('express');
var app = express(); // 主应用
var admin = express(); // 子应用
admin.get('/', function (req, res) {
  console.log(admin.mountpath); // /admin  挂载子应用程序的路径模式
  res.send('Admin Homepage');
})
app.use('/admin', admin); // 主应用上挂载子应用

该属性与req对象的baseUrl类似,不同的是 req.baseUrl返回匹配的URL路径,而非匹配的模式,如果子应用被挂载多个路径模式,app.mountpath返回挂载在其上的模式列表。

var admin = express();
var app = express();
admin.get('/', function (req, res) {
  console.log(req.baseUrl); // /adm*n 实际路径
  console.log(admin.mountpath); // [ '/adm*n', '/manager' ] 路径模式
  res.send('Admin Homepage');
})
var secret = express();
secret.get('/', function (req, res) {
  console.log(req.baseUrl) //adm*n/secr*t 
  console.log(secret.mountpath); // /secr*t
  res.send('Admin Secret');
});
admin.use('/secr*t', secret); // 子应用上挂载子应用
app.use(['/adm*n', '/manager'], admin); // 主应用上挂载子应用

####mount 事件

当挂载到主应用时,在子应用上的mount事件被触发。主应用可以被传递给回调函数。

var admin = express();
var app = express();
admin.on('mount', function (parent) {
  console.log('Admin Mounted');
  console.log(parent==app); // true
});
admin.get('/', function (req, res) {
  res.send('Admin Homepage');
});	
app.use('/admin', admin);