相关阅读:
Express 4.X API 翻译[一] -- Application篇
Express 4.X Api 翻译[二] -- Request篇
req.params
这是一个包含着被命名的路由规则“参数”的对象属性。例如如果你有一个路由规则为:”/user/:name”,然后这个”name”属性你就可以使用req.params.name来调用,这个属性默认为 {}
1 //GET /user/tj 2 req.params.name 3 //=>"tj"
当在定义路由规则的时候使用了正则表达式,匹配结果会被提供在数组里使用req.params[N],这里的N指的是第n个匹配数组。这样的规则被应用在使用未命名的通配匹配规则,例如/file/*
;
1 //GET /file/javascript/jquery.js 2 req.params[0] 3 // => "javascripts/jquery.js"
req.query
这个属性是一个对象属性包含着被解析过的请求参数对象,默认为{}
1 //GET /search?q=tobi+ferret 2 req.query.q 3 //=>"tobi ferret" 4 5 //GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse 6 req.query.order 7 // =>"desc" 8 req.query.shoe.color 9 //=>"blue" 10 req.query.shoe.type 11 //=>"converse"
req.body
这个属性是包含一个被解析过的请求体。这个功能是中间件 bodyParser 提供的,尽管其他的请求体解析中间件也会很好的支持这样的约定。这个属性会在使用了bodyParser()的时候被定义为{}。
1 //POST user[name]=tobi&user[email]=tobi@learnboost.com 2 req.body.user.name 3 //=> "tobi" 4 req.body.user.email 5 // =>"tobi@learnboost.com" 6 //POST {"name":"tobi"} 7 req.body.name 8 //=>"tobi"
req.param(name)
返回一个参数名为 name 的值
1 //?name=tobi 2 req.param('name'); 3 //=>"tobi" 4 5 //POST name=tobi 6 req.param('name') 7 //=>"tobi" 8 9 // /user/tobi 对应的路由规则为 /user/:name 10 req.param('name') 11 //=> "tobi"
查找的优先级如下:
- req.params
- req.body
- req.query
直接访问 req.body , req.params,和 req.query 应该是更加的清晰,除非你确实需要接受每个对象的输入。
req.route
当前匹配的 “Route” 包含一些属性,例如路由的原始字符串以及转换后的正则表达式等。
1 app.get('/user/:id?',function(req,res){ 2 console.log(req.route); 3 });
上面的例子将会输出以下内容:
1 { 2 path: '/user/:id?', 3 keys: [ {name:'id',optional:true} ], 4 regexp: /^\/user(?:\/([^\/]+?))?\/?$/i, 5 params:[id: '12'] 6 }
req.cookies
当cookieParser()中间件被使用的时候,这个对象将会被初始化为{},除此之外,还包含了由用户代理发送过来的cookies
1 //Cookie: name=tj 2 req.cookies.name 3 // =>"tj"
如果有任何问题或者疑问,请查阅cookie-parser的附加文档
req.signedCookies
当 cookieParser(secret)中间件被执行的时候,这个对象会被初始化为{},还包含了用户代理发送过来的被签名的cookie,未签名的和准备使用的。签名后的cookies被存放在一个单独的对象内,否则,攻击者会很轻松的替换掉”req.cookie”内的值。需要注意的是,签名的cookies并不带表它们是隐藏的或者是加密的,这个只是同于防止篡改cookies。
1 //Cookie: user = tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 2 req.signedCookies.user 3 //=> "tobi"
如果有任何问题或者疑问,请查阅cookie-parser的附加文档
req.get(field)
获取请求头内的 field 字段,不区分大小写,其中Referrer 和 Referer字段是可互换的。
1 req.get('Content-Type'); 2 //=>"text/plain" 3 req.get('content-type'); 4 // =>'text/plain' 5 req.get('Something'); 6 //=> undefined
别名为 req.header(field);
req.accepts(types)
检查给定的类型 types 是不是可以接受的类型,当是可接受的类型时返回最佳的匹配,否则返回 undefined – 在这种情况下,你应该返回406″Not Acceptable”。
type 的值可以是单一的一个mine类型的字符串,比如”application/json”,扩展名为”json”,也可以是一个以逗号分隔的列表或者数组。当为列表或数组时将返回最佳匹配。
1 //Accept: text/html 2 req.accepts('html'); 3 //=>"html" 4 // Accept: text/*, application/json 5 req.accepts('html'); 6 // => "html" 7 req.accepts('text/html'); 8 // => "text/html" 9 req.accepts('json, text'); 10 // => "json" 11 req.accepts('application/json'); 12 // => "application/json" 13 // Accept: text/*, application/json 14 req.accepts('image/png'); 15 req.accepts('png'); 16 // => undefined 17 // Accept: text/*;q=.5, application/json 18 req.accepts(['html', 'json']); 19 req.accepts('html, json'); 20 // => "json"
如果有任何问题或者疑问,请查阅accepts的附加文档
req.acceptsCharset(charset)
检查给定的 charset是否是可以被接受的
如果有任何问题或者疑问,请查阅accepts的附加文档
req.acceptsLanguage(lang)
检查给定的 lang 是否为可接受的
如果有任何问题或者疑问,请查阅accepts的附加文档
req.is(type)
检查提交进来的请求是否包含”Content-Type”头字段和他匹配的给定的mime type
1 // With Content-Type: text/html; charset=utf-8 2 req.is('html'); 3 req.is('text/html'); 4 req.is('text/*'); 5 // => true 6 // When Content-Type is application/json 7 req.is('json'); 8 req.is('application/json'); 9 req.is('application/*'); 10 // => true 11 req.is('html'); 12 // => false
如果有任何问题或者疑问,请查阅 type-is 的附加文档
req.ip
返回远程地址,或者在反向代理启用时返回上游ip地址。
1 req.ip 2 //=> 127.0.0.1
req.ips
当反向代理模式开启时,解析 “X-Forwarded-For” ip地址列表并返回一个数组,否则返回空数组。例如,如果一个值为”client,proxy1,proxy2″你将会收到数组["client","proxy1","proxy2"]这里可以看出”proxy2″是最远的下游地址。
req.path
返回请求的URL路径名。
1 //example com/users?sort=desc 2 req.path 3 // =>"/users"
req.host
返回从“Host”请求内取出的主机名,但是不包含端口号。
1 //Host: "example.com:3000" 2 req.host 3 //=> "example.com"
req.fresh
检查请求是否是新的 – 通过对Last-Modified或者 ETag进行匹配,来标明这个资源是不是”新的”。
1 req.fresh 2 //=>true
req.stale
检查这个请求是不是旧的 – 如果Last-Modified 或者 ETag 不匹配,标明这个资源是旧的。
1 req.stale 2 //=>true
req.xhr
检查请求头里是否有”X-Requested-With”这样的字段并且值为”XMLHttpRequest”(jQuery 等)请求时会设置这个头
1 req.xhr 2 //=> true
req.protocol
返回请求协议字符串 “http”或者”https”当请求为TLS时。当被启用反向代理时,”X-Forwarded-Proto” 请求头将会被信任。如果你运行一个支持https协议的反向代理,那么这个是会被支持的。
1 req.protocol 2 //=>"http"
req.secure
检查TLS连接是否已经被建立。下面是一段简写
1 'https' == req.protocol
req.subdomains
返回子域名数组
1 //Host:"tobi.ferrets.example.com" 2 req.subdomains 3 // =>['ferrets','tobi']
req.originalUrl
这个属性很像req.url,然而,他保留了原始请求的url,允许你在做内部路由的时候自由的重写 req.url。例如,app.use()会重写 req.url 为挂载点
1 // GET /search?q=something 2 req.originalUrl 3 //=> '/search?q=something'