请求
该req
对象表示HTTP请求,并具有请求查询字符串,参数,正文,HTTP标头等的属性。在本文档中,按照约定,该对象始终称为req
(并且HTTP响应为res
),但其实际名称由您正在其中使用的回调函数的参数确定。
例如:
app.get('/user/:id', function (req, res) {
res.send('user ' + req.params.id)
})
但是您也可以拥有:
app.get('/user/:id', function (request, response) {
response.send('user ' + request.params.id)
})
该req
对象是Node自己的请求对象的增强版本,并支持所有内置字段和方法。
属性
在Express 4中,默认情况下
req.files
该req
对象不再可用。到上访问上传的文件req.files
对象,使用多处理中间件像打杂,multer, 强大, 多方, 连接多党或佩斯。
req.app
此属性保存对使用中间件的Express应用程序实例的引用。
如果遵循创建仅导出中间件功能并将require()
其导出到主文件中的模块的模式,则中间件可以通过以下方式访问Express实例:req.app
例如:
// index.js
app.get('/viewdirectory', require('./mymiddleware.js'))
// mymiddleware.js
module.exports = function (req, res) {
res.send('The views directory is ' + req.app.get('views'))
}
req.baseUrl
路由器实例安装所在的URL路径。
该req.baseUrl
属性类似于对象的mountpath属性app
,不同之处app.mountpath
在于返回匹配的路径模式。
例如:
var greet = express.Router()
greet.get('/jp', function (req, res) {
console.log(req.baseUrl) // /greet
res.send('Konichiwa!')
})
app.use('/greet', greet) // load the router on '/greet'
即使您使用路径模式或一组路径模式来加载路由器,该baseUrl
属性也会返回匹配的字符串,而不是模式。在以下示例中,greet
路由器在两个路径模式中加载。
app.use(['/gre+t', '/hel{2}o'], greet) // load the router on '/gre+t' and '/hel{2}o'
向发出请求时/greet/jp
,req.baseUrl
为“ / greet”。向发出请求时/hello/jp
,req.baseUrl
为“ / hello”。
req.body
包含在请求正文中提交的数据的键值对。默认情况下,它是undefined
,并且在使用诸如express.json()
或的正文解析中间件时进行填充express.urlencoded()
。
以下示例说明如何使用正文解析中间件进行填充req.body
。
var express = require('express')
var app = express()
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
app.post('/profile', function (req, res, next) {
console.log(req.body)
res.json(req.body)
})
req.cookies
使用cookie解析器中间件时,此属性是一个包含请求发送的cookie的对象。如果请求中不包含Cookie,则默认为{}
。
// Cookie: name=tj
console.dir(req.cookies.name)
// => 'tj'
如果cookie已经签名,则必须使用req.signedCookies。
有关更多信息,问题或疑虑,请参阅cookie-parser。
req.fresh
当响应仍然“新鲜”时,将true
返回客户端的缓存,否则false
返回以表明客户端缓存现在已过时,应发送完整的响应。
当客户端发送Cache-Control: no-cache
请求标头以指示端对端重载请求时,此模块将返回false
以透明地处理这些请求。
有关缓存验证工作原理的更多详细信息,请参见 HTTP / 1.1缓存规范。
console.dir(req.fresh)
// => true
req.hostname
包含从Host
HTTP标头派生的主机名。
如果trust proxy
设置的计算结果 不为false
,则此属性将从X-Forwarded-Host
标题字段获取值。此标头可以由客户端或代理设置。
如果X-Forwarded-Host
请求中有多个标头,则使用第一个标头的值。这包括具有逗号分隔值的单个标头,其中使用了第一个值。
在Express v4.17.0之前,X-Forwarded-Host
不能包含多个值或出现多次。
// Host: "example.com:3000"
console.dir(req.hostname)
// => 'example.com'
req.ip
包含请求的远程IP地址。
如果trust proxy
设置的计算结果不为false
,则此属性的值从X-Forwarded-For
标题中最左边的条目派生 。此标头可以由客户端或代理设置。
console.dir(req.ip)
// => '127.0.0.1'
req.ips
如果trust proxy
设置的计算结果不为false
,则此属性包含在X-Forwarded-For
请求标头中指定的IP地址数组。否则,它包含一个空数组。此标头可以由客户端或代理设置。
例如,如果X-Forwarded-For
是client, proxy1, proxy2
,req.ips
将是 ["client", "proxy1", "proxy2"]
,其中proxy2
是最下游。
req.method
包含对应于该请求的HTTP方法的字符串: GET
,POST
,PUT
,等。
req.originalUrl
req.url
不是本机Express属性,它是从Node的http模块继承的。
这个属性很像req.url
; 但是,它保留了原始请求URL,允许您req.url
自由重写以用于内部路由。例如,app.use()的“安装”功能将被重写req.url
以剥离安装点。
// GET /search?q=something
console.dir(req.originalUrl)
// => '/search?q=something'
在中间件功能,req.originalUrl
是的组合req.baseUrl
和req.path
,作为显示在下面的例子。
app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new'
console.dir(req.originalUrl) // '/admin/new'
console.dir(req.baseUrl) // '/admin'
console.dir(req.path) // '/new'
next()
})
req.params
此属性是一个对象,其中包含映射到命名路由“ parameters”的属性。例如,如果您有路线/user/:name
,则“ name”属性可以用作req.params.name
。该对象默认为{}
。
// GET /user/tj
console.dir(req.params.name)
// => 'tj'
当您使用正则表达式进行路由定义时,使用会在数组中提供捕获组req.params[n]
,其中n
第n 捕获组。此规则适用于带有字符串路由的未命名通配符匹配,例如/file/*
:
// GET /file/javascripts/jquery.js
console.dir(req.params[0])
// => 'javascripts/jquery.js'
如果您需要更改中的键req.params
,请使用app.param处理程序。更改仅适用于已在路径中定义的参数。req.params
在中间件或路由处理程序中对该对象所做的任何更改将被重置。
注意:Express会自动解码中的值
req.params
(使用decodeURIComponent
)。
req.path
包含请求URL的路径部分。
// example.com/users?sort=desc
console.dir(req.path)
// => '/users'
从中间件调用时,挂载点不包含在中req.path
。有关更多详细信息,请参见app.use()。
req.protocol
包含请求协议字符串:http
或(对于TLS请求)https
。
如果trust proxy
设置的计算结果不为false
,则此属性将使用X-Forwarded-Proto
标题字段的值(如果存在)。此标头可以由客户端或代理设置。
console.dir(req.protocol)
// => 'http'
req.query
此属性是一个对象,其中包含路由中每个查询字符串参数的属性。将查询解析器设置为禁用时,它是一个空对象{}
,否则是配置的查询解析器的结果。
由于
req.query
的形状基于用户控制的输入,因此该对象中的所有属性和值都不可信,应在可信之前进行验证。例如,req.query.foo.toString()
可能以多种方式失败,例如foo
可能不存在或可能不是字符串,并且toString
可能不是函数,而是字符串或其他用户输入。
// GET /search?q=tobi+ferret
console.dir(req.query.q)
// => 'tobi ferret'
// GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
console.dir(req.query.order)
// => 'desc'
console.dir(req.query.shoe.color)
// => 'blue'
console.dir(req.query.shoe.type)
// => 'converse'
// GET /shoes?color[]=blue&color[]=black&color[]=red
console.dir(req.query.color)
// => ['blue', 'black', 'red']
req.route
包含当前匹配的路由,一个字符串。例如:
app.get('/user/:id?', function userIdHandler (req, res) {
console.log(req.route)
res.send('GET')
})
上一片段的示例输出:
{ 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。相当于:
console.dir(req.protocol === 'https')
// => true
req.signedCookies
使用cookie解析器中间件时,此属性包含请求发送的已签名的cookie,未签名且可以使用。已签名的cookie位于另一个对象中,以显示开发人员的意图。否则,可能会对req.cookie
值(很容易欺骗)进行恶意攻击 。请注意,对cookie进行签名不会使其“隐藏”或加密。但只是防止篡改(因为用于签名的秘密是私有的)。
如果未发送签名的Cookie,则该属性默认为{}
。
// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3
console.dir(req.signedCookies.user)
// => 'tobi'
有关更多信息,问题或疑虑,请参阅cookie-parser。
req.stale
指示请求是否为“过时”,并且与相对req.fresh
。有关更多信息,请参见req.fresh。
console.dir(req.stale)
// => true
req.subdomains
请求的域名中的子域数组。
// Host: "tobi.ferrets.example.com"
console.dir(req.subdomains)
// => ['ferrets', 'tobi']
application属性subdomain offset
(默认为2)用于确定子域段的开头。要更改此行为,请使用app.set更改其值。
req.xhr
一个布尔型属性,true
如果请求的X-Requested-With
标头字段为“ XMLHttpRequest”,则表明该请求是由诸如jQuery之类的客户端库发出的。
console.dir(req.xhr)
// => true
方法
req.accepts(types)
根据请求的Accept
HTTP标头字段检查指定的内容类型是否可接受。该方法返回最佳匹配,或者如果指定的内容类型都不可接受,则返回 false
(在这种情况下,应用程序应使用响应406 "Not Acceptable"
)。
该type
值可以是单个MIME类型字符串(例如“ 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')
// => false
// Accept: text/*;q=.5, application/json
req.accepts(['html', 'json'])
// => "json"
有关更多信息,或者如果您有任何问题或疑虑,请参阅接受。
req.acceptsCharsets(charset [, …])
根据请求的Accept-Charset
HTTP标头字段,返回指定字符集的第一个可接受的字符集。如果不接受任何指定的字符集,则返回false
。
有关更多信息,或者如果您有任何问题或疑虑,请参阅接受。
req.acceptsEncodings(encoding [, …])
根据请求的Accept-Encoding
HTTP标头字段,返回指定编码的第一个接受的编码。如果不接受任何指定的编码,则返回false
。
有关更多信息,或者如果您有任何问题或疑虑,请参阅接受。
req.acceptsLanguages(lang [, …])
根据请求的Accept-Language
HTTP标头字段,返回指定语言的第一种可接受的语言。如果不接受任何指定的语言,则返回false
。
有关更多信息,或者如果您有任何问题或疑虑,请参阅接受。
req.get(field)
返回指定的HTTP请求标头字段(不区分大小写的匹配)。在Referrer
和Referer
领域是可以互换的。
req.get('Content-Type')
// => "text/plain"
req.get('content-type')
// => "text/plain"
req.get('Something')
// => undefined
req.is(type)
如果传入请求的“ Content-Type” HTTP标头字段与type
参数指定的MIME类型匹配,则返回匹配的内容类型。如果请求没有正文,则返回null
。false
否则返回。
// With Content-Type: text/html; charset=utf-8
req.is('html')
// => 'html'
req.is('text/html')
// => 'text/html'
req.is('text/*')
// => 'text/*'
// When Content-Type is application/json
req.is('json')
// => 'json'
req.is('application/json')
// => 'application/json'
req.is('application/*')
// => 'application/*'
req.is('html')
// => false
有关更多信息,或者如果您有任何问题或疑虑,请参阅type-is。
req.param(name [, defaultValue])
不推荐使用。二者必选其一
req.params
,req.body
或req.query
(如适用)。
name
如果存在,则返回param的值。
// ?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
(可选)defaultValue
如果未在任何请求对象中找到参数,则可以指定设置默认值。
直接访问
req.body
,req.params
以及req.query
应该赞成清晰-除非你真正接受来自每个对象的输入。 必须加载人体分析中间件才能req.param()
正常工作。有关详细信息,请参见主体。
req.range(size[, options])
Range
标头解析器。
该size
参数是资源的最大大小。
该options
参数是可以具有以下属性的对象。
属性 | 类型 | 描述 |
---|---|---|
combine |
Boolean | 指定是否应合并重叠范围和相邻范围,默认为false 。如果为true ,则将合并范围并返回它们,就像在标题中以这种方式指定它们一样。 |
将返回范围数组或表示错误解析的负数。
-2
表示格式错误的标题字符串-1
表示范围无法满足// parse header from request var range = req.range(1000) // the type of the range if (range.type === 'bytes') { // the ranges range.forEach(function (r) { // do something with r.start and r.end }) }