Express 4.x API---(2)
2015-11-23 11:31
281 查看
Request
req对象代表了一个HTTP请求,其具有一些属性来保存请求中的一些数据,比如
query string,
parameters,
body,
HTTP headers等等。在本文档中,按照惯例,这个对象总是简称为
req(http响应简称为
res),但是它们实际的名字由这个回调方法在那么使用时的参数决定。
如下例子:
[code] app.get('/user/:id', function(req, res) { res.send('user' + req.params.id); });
其实你也可以这样写:
[code] app.get('/user/:id', function(request, response) { response.send('user' + request.params.id); });
Properties
在Express 4中,
req.files默认在
req对象中不再是可用的。为了通过
req.files对象来获得上传的文件,你可以使用一个
multipart-handling(多种处理的工具集)中间件,比如
busboy,
multer,
formidable,
multipraty,
connect-multiparty或者
pez。
req.app
这个属性持有express程序实例的一个引用,其可以作为中间件使用。
如果你按照这个模式,你创建一个模块导出一个中间件,这个中间件只在你的主文件中
require()它,那么这个中间件可以通过
req.app来获取express的实例。
例如:
[code] // index.js app.get("/viewdirectory", require('./mymiddleware.js'));
req.baseUrl
一个路由实例挂载的Url路径。[code] var greet = express.Router(); greet.get('/jp', function(req, res) { console.log(req.baseUrl); // greet res.send('Konichiwa!'); }); app.use('/greet', greet);
即使你使用的路径模式或者一系列路径模式来加载路由,
baseUrl属性返回匹配的字符串,而不是路由模式。下面的例子,
greet路由被加载在两个路径模式上。
[code]app.use(['/gre+t', 'hel{2}o'], greet); // load the on router on '/gre+t' and '/hel{2}o'
当一个请求路径是
/greet/jp,
baseUrl是
/greet,当一个请求路径是
/hello/jp,
req.baseUrl是
/hello。
req.baseUrl和
app对象的mountpath属性相似,除了
app.mountpath返回的是路径匹配模式。
req.body
在请求的body中保存的是提交的一对对键值数据。默认情况下,它是undefined,当你使用比如
body-parser和
multer解析
body数据的中间件时,它是填充的。
下面的例子,给你展示了怎么使用
body-parser中间件来填充
req.body。
[code] var app = require('express'); var bodyParser = require('body-parser'); var multer = require('multer');// v1.0.5 var upload = multer(); // for parsing multipart/form-data app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({extended:true})); // for parsing application/x-www-form-urlencoded app.post('/profile', upload.array(), function(req, res, next) { console.log(req.body); res.json(req.body); });
req.cookies
当使用cookie-parser中间件的时候,这个属性是一个对象,其包含了请求发送过来的
cookies。如果请求没有带
cookies,那么其值为
{}。
[code] // Cookie: name=tj req.cookies.name // => "tj"
获取更多信息,问题,或者关注,可以查阅cookie-parser。
req.fresh
指示这个请求是否是新鲜的。其和req.stale是相反的。
当
cache-control请求头没有
no-cache指示和下面中的任一一个条件为
true,那么其就为
true:
if-modified-since请求头被指定,和
last-modified请求头等于或者早于
modified请求头。
if-none-match请求头是
*。
if-none-match请求头在被解析进它的指令之后,不匹配
etag回复头(完全不知道什么鬼)。
[code] req.fresh // => true
req.hostname
包含了源自HostHTTP头部的
hostname。
当
trust proxy设置项被设置为启用值,
X-Forwarded-Host头部被使用来代替
Host。这个头部可以被客户端或者代理设置。
[code]// Host: "example.com" req.hostname // => "example.com"
req.ips
当trust proxy设置项被设置为启用值,这个属性包含了一组在
X_Forwarded-For请求头中指定的IP地址。不然,其就包含一个空的数组。这个头部可以被客户端或者代理设置。
例如,如果
X-Forwarded-For是
client,
proxy1,
proxy2,
req.ips就是
["clinet", "proxy1", "proxy2"],这里
proxy2就是最远的下游。
req.originalUrl
req.url不是一个原生的
Express属性,它继承自Node’s http module。
这个属性很像
req.url;然而,其保留了原版的请求链接,允许你自由地重定向
req.url到内部路由。比如,
app.use()的
mounting特点可以重定向
req.url跳转到挂载点。
[code]// GET /search?q=something req.originalUrl // => "/search?q=something"
req.params
一个对象,其包含了一系列的属性,这些属性和在路由中命令的参数名是一一对应的。例如,如果你有/user/:name路由,
name属性可作为
req.params.name。这个对象默认值为
{}。
[code]// GET /user/tj req.params.name // => "tj"
当你使用正则表达式来定义路由规则,捕获组的组合一般使用
req.params,这里的
n是第几个捕获租。这个规则被施加在无名通配符匹配,比如
/file/*的路由:
[code]// GET /file/javascripts/jquery.js req.params[0] // => "javascripts/jquery.js"
req.path
包含请求URL的部分路径。[code]// example.com/users?sort=desc req.path // => "/users"
当在一个中间件中被调用,挂载点不包含在
req.path中。你可以查阅app.use()获得跟多的信息。
req.protocol
请求的协议,一般为http,当启用TLS加密,则为
https。
当
trust proxy设置一个启用的参数,如果存在
X-Forwarded-Proto头部的话,其将被信赖和使用。这个头部可以被客户端或者代理设置。
[code]req.ptotocol // => "http"
req.query
一个对象,为每一个路由中的query string参数都分配一个属性。如果没有
query string,它就是一个空对象,
{}。
[code]// GET /search?q=tobi+ferret req.query.a // => "tobi ferret" // GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse req.query.order // => "desc" req.query.shoe.color // => "blue" req.query.shoe.type // => "converse"
req.route
当前匹配的路由,其为一串字符。比如:[code]app.get('/user/:id?', function userIdHandler(req, res) { console.log(req.route); res.send('GET') })
前面片段的输出为:
[code]{ path:"/user/:id?" stack: [ { handle:[Function:userIdHandler], name:"userIdHandler", params:undefined, path:undefined, keys:[], regexp:/^\/?$/i, method:'get' } ] methods:{get:true} }
req.secure
一个布尔值,如果建立的是TLS的连接,那么就为true。等价与:
[code] 'https' == req.protocol;
req.signedCookies
当使用cookie-parser中间件的时候,这个属性包含的是请求发过来的签名
cookies,不签名的并且为使用做好了准备(这句真不知道怎么翻译了…)。签名
cookies驻留在不同的对象中来体现开发者的意图;不然,一个恶意攻击可以被施加在
req.cookie值上(它是很容易被欺骗的).记住,签名一个
cookie不是把它藏起来或者加密;而是简单的防止篡改(因为签名使用的加密是私人的)。如果没有发送签名的
cookie,那么这个属性默认为
{}。
[code]// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 req.signedCookies.user // => "tobi"
为了获取更多的信息,问题或者关注,可以参阅cookie-parser。
req.stale
指示这个请求是否是stale(陈旧的),它与
req.fresh是相反的。更多信息,可以查看req.fresh。
[code]req.stale // => true
req.subdomains
请求中域名的子域名数组。[code]// Host: "tobi.ferrets.example.com" req.subdomains // => ["ferrets", "tobi"]
req.xhr
一个布尔值,如果X-Requested-With的值为
XMLHttpRequest,那么其为
true,其指示这个请求是被一个客服端库发送,比如
jQuery。
[code]req.xhr // => true
Methods
req.accepts(types)
检查这个指定的内容类型是否被接受,基于请求的AcceptHTTP头部。这个方法返回最佳匹配,如果没有一个匹配,那么其返回
undefined(在这个case下,服务器端应该返回406和”Not Acceptable”)。
type值可以是一个单的
MIME type字符串(比如
application/json),一个扩展名比如
json,一个逗号分隔的列表,或者一个数组。对于一个列表或者数组,这个方法返回最佳项(如果有的话)。
[code]// Accept: text/html req.accepts('html'); // => "html" // Accept: text/*, application/json req.accepts('html'); // => "html" req.accepts('text/html'); // => "text/html" req.accepts(['json', 'text']); // => "json" req.accepts('application/json'); // => "application/json" // Accept: text/*, application/json req.accepts('image/png'); req.accepts('png'); // => undefined // Accept: text/*;q=.5, application/json req.accepts(['html', 'json']); // => "json"
获取更多信息,或者如果你有问题或关注,可以参阅accepts。
req.acceptsCharsets(charset[, …])
返回指定的字符集集合中第一个的配置的字符集,基于请求的Accept-CharsetHTTP头。如果指定的字符集没有匹配的,那么就返回false。
获取更多信息,或者如果你有问题或关注,可以参阅accepts。
req.acceptsEncodings(encoding[, …])
返回指定的编码集合中第一个的配置的编码集,基于请求的Accept-EncodingHTTP头。如果指定的编码集没有匹配的,那么就返回false。
获取更多信息,或者如果你有问题或关注,可以参阅accepts。
req.acceptsLanguages(lang [, …])
返回指定的语言集合中第一个的配置的编码集,基于请求的Accept-LanguageHTTP头。如果指定的语言集没有匹配的,那么就返回false。
获取更多信息,或者如果你有问题或关注,可以参阅accepts。
req.get(field)
返回请求指定的HTTP头部的域内容(不区分大小写)。Referrer和
Referer的域内容可互换。
[code]req.get('Content-type'); // => "text/plain" req.get('content-type'); // => "text/plain" req.get('Something') // => undefined
其是
req.header(field)的别名。
req.is(type)
如果进来的请求的Content-type头部域匹配参数
type给定的
MIME type,那么其返回
true。否则返回
false。
[code]// With Content-Type: text/html; charset=utf-8 req.is('html'); req.is('text/html'); req.is('text/*'); // => true // When Content-Type is application/json req.is('json'); req.is('application/json'); req.is('application/*'); // => true req.is('html'); // => false
获取更多信息,或者如果你有问题或关注,可以参阅type-is。
req.param(naem, [, defaultValue])
过时的。可以在适合的情况下,使用req.params,’req.body’或者
req.query。
返回当前参数
name的值。
[code]// ?name=tobi req.param('name') // => "tobi" // POST name=tobi req.param('name') // => "tobi" // /user/tobi for /user/:name req.param('name') // => "tobi"
按下面给出的顺序查找配置的:
req.params
req.body
req.query
可选的,你可以指定一个默认值来设置一个默认值,如果这个参数在任何一个请求的对象中都不能找到。
直接通过
req.params,’req.body’,’req.query’取得应该更加的清晰-除非你确定每一个对象的输入。
Body-parser中间件必须加载,如果你使用
req.param()。详细请看req.body。
相关文章推荐
- Spring注解@PostConstruct与@PreDestroy
- UVA-11806 - Cheerleaders(dp+容斥)
- 【论文笔记】A Foundational Approach to Mining Itemset Utilities from Databases
- Objective-C 编码建议
- http和socket之长连接和短连接区别
- 集成平台自动登入+C# Login控件,造成的HttpContext.Current.User.Identity.Name 为空问题解决方案
- ubuntu super daemon设置
- 集成银联支付
- Swift -- 创建空数组和空字典
- C++ STL源码剖析
- lsof移植
- jmeter内存溢出处理方式记录
- 通过矩阵求两个向量集中元素两两之间的欧氏距离(python实现)
- 快速排序算法
- u盘烧写后实际容量变小了
- C语言运算符优先级 详细列表
- STL stl_config.h
- 婺源石城、长溪与理坑秋行散记
- oracle 含数字的字符串的排序问题
- Myeclipse2014中,新建部署Maven项目