Express4.x API 翻译[2] – Request

req.params

此属性是一个包含映射路由”parameters”的对象。例如你使用/user/:name路由,那么”name”属性对你来说就是一个req.params.name变量。该对象默认为{}。

// GET /user/tj
req.params.name
// => "tj"

当在定义路由规则时使用了正则表达式,使用req.params[N]获取所有参数匹配数组,其中N表示数组的第几个。此规则适用于包含未定义的通配符的路由字符串,例如/file/*

// GET /file/javascripts/jquery.js
req.params[0]
// => "javascripts/jquery.js" ### req.query

此属性是一个包含解析查询字符串的对象,默认为{}。

// GET /search?q=tobi+ferret
req.query.q
// => "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.param(name)

返回当前name参数的值。

// ?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.body,req.params,和req.query应该更新清晰,除非你确实需要接收每个对象的输入。

req.route

当前匹配的路由包含多个属性,如路由的原始路径字符串以及转换后的正则表达式等。

app.get('/user/:id?', function(req, res){
  console.log(req.route);
});

上面的代码输出结果:

{ path: '/user/:id?',
  keys: [ { name: 'id', optional: true } ],
  regexp: /^\/user(?:\/([^\/]+?))?\/?$/i,
  params: [ id: '12' ] } ### req.cookies

当cookieParser()中间件使用时该对象默认为{},除此之外还包含由用户代理发送的cookies。

// Cookie: name=tj
req.cookies.name
// => "tj"

如有任何问题或者疑问请参阅cookie-parser附加文档。

req.signedCookies

当cookieParser(secret)中间件使用该对象默认为{},还包括用户代理发送的签名cookies,未签名以及准备使用的。签名cookies存放于一个单独的对象,以显示开发者的意图,否则可以通过在req.cookie设置值发起恶意攻击,从而很轻易的欺骗。需要注意的是签名的cookie并不意味着它是隐藏的或者是加密的,这个防止篡改的秘密只是简单的将签名私有化。

// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3
req.signedCookies.user
// => "tobi" 如有任何问题或者疑问请参阅cookie-parser附加文档。

req.get(field)

获取请求头内的field字段,不区分大小写。Referrer和Referer字段可以互换。

req.get('Content-Type');
// => "text/plain"

req.get('content-type');
// => "text/plain"

req.get('Something');
// => undefined 别名为req.header(field)。

req.accepts(types)

检查给定的types是不是可以接受的,当结果为true时返回最佳匹配,否则返回undefined,在这种情况下你应该返回406”Not Acceptable”。

type可以是单一的mine类型的字符串,比如”application/json”,扩展名如”json”,也可以是以逗号分隔的列表或者数组。当为列表或数组时将返回最佳匹配。

// 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']);
req.accepts('html, json');
// => "json"

如有任何问题或者疑问,请参阅accepts附加文档。

req.acceptsCharset(charset)

检查给定的字符集是否可以支持。

如有任何问题或者疑问,请参阅accepts附加文档。

req.acceptsLanguage(lang)

检查给定的lang是否支持。

如有任何问题或者疑问,请参阅accepts附加文档。

req.is(type)

检查传入请求字符串是否包含了”Content-Type”头字段,并且给出匹配的mine类型。

// 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.ip

返回远程地址,或者当信任代理已启用时返回代理地址。

req.ip
// => "127.0.0.1" ### req.ips

当信任代理为true时,解析”X-Forwarded-For”ip地址列表返回一个数组,否则返回一个空数组。例如当值为”client, proxy1, proxy2”时你会获得[“client”, “proxy1”, “proxy2”]数组,其中”proxy2”是最远的下游地址。

req.path

返回请求的URL路径名。

// example.com/users?sort=desc
req.path
// => "/users" ### req.host Returns the hostname from the "Host" header field (void of portno).

返回从”Host”头字段内取出的主机名(不包含端口)。

// Host: "example.com:3000"
req.host
// => "example.com" ### req.fresh

检查请求是否刷新,通过对Last-Modified和/或ETag进行匹配,表明资源是不是最新的。

req.fresh
// => true 如有任何问题或者疑问,请参阅fresh附加文档。

req.stale

检查请求是否过期,如果Last-Modified和/或ETag不匹配,表有资源是过期的。

req.stale
// => true ### req.xhr

检查请求头里是否包含”X-Requested-With”字段并且值为”XMLHttpRequest”(jQuery等)。

req.xhr
// => true ### req.protocol 当使用TLS请求时返回"http"或"https"协议字符串。当信任路由设置为开启时"X-Forwarded-Proto"头字段将被信任。如果你正在运行一个支持https协议的反向代理,那么这个是支持的。


req.protocol
// => "http" ### req.secure

检查TLS连接是否建立。这是一个简写:

'https' == req.protocol; ### req.subdomains Return subdomains as an array. 返回子域数组。

// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"] ### req.originalUrl

此属性很像req.url,但它保留了原始请求的url,允许你在做内部路由时自由重写req.url。例如app.use()中间件将重写req.url重新定义挂载点。

// GET /search?q=something
req.originalUrl
// => "/search?q=something"