个人博客

A web front-end programmer's personal blog.

Express API 测试用例整理(三)

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

###Response部分

####res.status

支持链式调用,可以修改返回的状态码

var express = require('express');
var app = express();
app.set('views','./public');
app.set('view engine','jade');
app.get('/page',function(req,res,next){	
	res.status(404).render('page',{title:'Hello jade',message:'This is a node express jade'});
});
app.listen(3000);

####res.set

设置响应头字段,也可以一次传入一个对象设置多个值。

res.set({
	'Content-Type' : 'text/html',
	'Content-Length' : '124',
	'ETag' : '12345',
	'testHeader' : 'blue'
});
res.status(200).render('page',{title:'Hello jade',message:'This is a node express jade'});

####res.get

返回一个大小写不敏感的响应头信息的值

res.get('Content-Type'); // "text/html"

####res.cookie

设置cookie信息,接受字符串参数或者JSON对象。

app.get('/page',function(req,res,next){
res.cookie('name','blue',{expires:new Date(Date.now()+90000),httpOnly:true});
res.status(200).render('page',{title:'Hello jade',message:'This is a node express jade'});
});

该函数接受三个参数,分别为要设置的cookie名称,要设置的cookie值和该cookie的配置信息json对象。 该json对象拥有一些常用的属性如下;

  1. path : 默认为 ‘/’;
  2. maxAge : 一个便利的设置 expires 的过期时间,它是从当前时间算起的毫秒数
  3. httpOnly
  4. domain
  5. secrue
  6. expires
  7. first-Party

####res.clearCookie

把对应cookie清除

res.clearCookie('name',{path:'/'});

####res.redirect

使用可选的状态码跳转到url,状态码status 默认为302

app.get('/page',function(req,res,next){
	res.redirect('http://www.baidu.com'); //直接跳转
	res.redirect(200,'www.baidu.com'); //向导跳转
});

express支持几种跳转:

  1. 使用一个完整的URI跳转到一个完全不同的网站。res.redirect('http://www.baidu.com')
  2. 使用相对路径跳转,如果你现在在 http://example.com/admin/post/new 这个页面中, res.redirect('/admin') 将会把你带到 http://example.com/admin
  3. 路径名 . 跳转也同样支持类似 Linux中的 cd ..
  4. 最后也是最特别的 back 跳转,它会把你带回referer的地址,当referer丢失的时候默认为 / 。使用 res.redirect('back')

####res.location

设置请求头的 location

res.location('/foo/bar/');

####res.charset

设置字符集。默认为 ’utf-8’

####res.send

发送一个响应,这个方法在输出non-streaming响应的时候自动完成了大量有用的任务 比如如果在它前面没有定义Content-Length, 它会自动设置; 比如加一些自动的 HEAD; 比如对HTTP缓存的支持 。

  1. 当参数为一个 Buffer时 Content-Type 会被设置为 “application/octet-stream” 。
  2. 当参数为一个String时 Content-Type 默认设置为”text/html”
  3. 当参数为 Array 或者 Object 时 Express 会返回一个 JSON
  4. 最后一条当一个Number 作为参数, 并且没有上面提到的任何一条在响应体里, Express会帮你设置一个响应体 比如200 会返回字符”OK”, 404会返回”Not Found”等等.

####res.json

返回一个 JSON 响应。 当res.send() 的参数是一个对象或者数组的时候, 会调用这个方法。 当然它也在复杂的空值(null, undefined, etc)JSON转换的时候很有用, 因为规范上这些对象不是合法的JSON。

app.get('/page',function(req,res,next){
	res.json(500,{error:'message'});
});

####res.jsonp

返回一个支持JSONP的JSON响应。这个方法同样使用了 res.json ,只是加了一个可以自定义的JSONP回调支持。默认情况下JSONP回调的函数名就是 callback 。你可以通过设置 jsonp callback name 来修改这个值。

// ?callback=foo
res.jsonp({ user: 'tobi' })
// => foo({ "user": "tobi" })

app.set('jsonp callback name', 'cb');

// ?cb=foo
res.jsonp(500, { error: 'message' })
// => foo({ "error": "message" })

####res.format

设置特定请求头的响应。下面的例子展示了在请求头设置为 application/json或者 */json 的时候会返回 {"message":"hey"} ,如果设置的是 */* 那么所以返回的都是 hey

res.format({
  'text/plain': function(){
    res.send('hey');
  },
  
  'text/html': function(){
    res.send('hey');
  },
  
  'application/json': function(){
    res.send({ message: 'hey' });
  }
});

除了使用标准的MIME 类型,你也可以使用扩展名来映射这些类型 下面是一个不太完整的实现:

res.format({
  text: function(){
    res.send('hey');
  },
  
  html: function(){
    res.send('hey');
  },
  
  json: function(){
    res.send({ message: 'hey' });
  }
});

####res.sendfile

可接收3个参数,path, [options], [fn], path为所传输附件的路径。它会根据文件的扩展名自动设置响应头里的Content-Type字段。fn 回调函数在传输完成或发生错误时会被调用。 options :

  • maxAge 毫秒,默认为 0
  • root 文件相对路径

这个方法可以非常友好的支持有缩略图的文件服务。

####res.download

接受3个参数,path, [filename],[fn] path所需传输附件的路径,通常情况下浏览器会弹出一个下载文件的窗口。 浏览器弹出框里的文件名和响应头里的Disposition “filename=” 参数是一致的, 你也可以通过传入filename来自由设置。 当在传输的过程中发生一个错误时,可选的回调函数fn会被调用执行。 这个方法使用res.sendfile()传输文件。

res.download('/report-12345.pdf');

res.download('/report-12345.pdf', 'report.pdf');

res.download('/report-12345.pdf', 'report.pdf', function(err){
  if (err) {
    // 处理错误,请牢记可能只有部分内容被传输,所以
    // 检查一下res.headerSent
  } else {
    // 减少下载的积分值之类的
  }
});

####res.links

合并给定的links, 并且设置给响应头里的”Link” 字段。

res.links({
  next: 'http://api.example.com/users?page=2',
  last: 'http://api.example.com/users?page=5'
});

转换后

Link: <http://api.example.com/users?page=2>; rel="next", 
      <http://api.example.com/users?page=5>; rel="last"

####res.locals

在某一次请求范围下的响应体的本地变量,只对此次请求期间的views可见。 另外这个API其实和 app.locals是一样的。(应该只在该回调域内)

这个对象在放置请求级信息时非常有用,比如放置请求的路径名,验证过的用户,用户设置等等

app.use(function(req, res, next){
  res.locals.user = req.user;
  res.locals.authenticated = ! req.user.anonymous;
  next();
});

####res.render

渲染view, 同时向callback 传入渲染后的字符串。 callback如果不传的话,直接会把渲染后的字符串输出至请求方, 一般如果不需要再对渲染后的模板作操作,就不需要传callback。 当有错误发生时next(err)会被执行. 如果提供了callback参数,可能发生的错误和渲染的字符串都会被当作参数传入, 并且没有默认响应。

var express = require('express');
var app = express();
app.set('views','./public');
app.set('view engine','jade');
app.get('/page',function(req,res,next){;
	res.render('page',{title:'Hello jade',message:'This is a node express jade'});
});
app.listen(3000);