请求

req对象表示HTTP请求,并具有请求查询字符串,参数,正文,HTTP标头等的属性。在本文档中,按照约定,该对象始终称为req(并且HTTP响应为res),但其实际名称由您正在其中使用的回调函数的参数确定。
例如:

  1. app.get('/user/:id', function (req, res) {
  2. res.send('user ' + req.params.id)
  3. })

但是您也可以拥有:

  1. app.get('/user/:id', function (request, response) {
  2. response.send('user ' + request.params.id)
  3. })

req对象是Node自己的请求对象的增强版本,并支持所有内置字段和方法

属性

在Express 4中,默认情况下req.filesreq对象不再可用。到上访问上传的文件req.files对象,使用多处理中间件像打杂multer强大多方连接多党佩斯

req.app

此属性保存对使用中间件的Express应用程序实例的引用。
如果遵循创建仅导出中间件功能并将require()其导出到主文件中的模块的模式,则中间件可以通过以下方式访问Express实例:req.app
例如:

  1. // index.js
  2. app.get('/viewdirectory', require('./mymiddleware.js'))
  1. // mymiddleware.js
  2. module.exports = function (req, res) {
  3. res.send('The views directory is ' + req.app.get('views'))
  4. }

req.baseUrl

路由器实例安装所在的URL路径。
req.baseUrl属性类似于对象的mountpath属性app,不同之处app.mountpath在于返回匹配的路径模式。
例如:

  1. var greet = express.Router()
  2. greet.get('/jp', function (req, res) {
  3. console.log(req.baseUrl) // /greet
  4. res.send('Konichiwa!')
  5. })
  6. app.use('/greet', greet) // load the router on '/greet'

即使您使用路径模式或一组路径模式来加载路由器,该baseUrl属性也会返回匹配的字符串,而不是模式。在以下示例中,greet路由器在两个路径模式中加载。

  1. app.use(['/gre+t', '/hel{2}o'], greet) // load the router on '/gre+t' and '/hel{2}o'

向发出请求时/greet/jpreq.baseUrl为“ / greet”。向发出请求时/hello/jpreq.baseUrl为“ / hello”。

req.body

包含在请求正文中提交的数据的键值对。默认情况下,它是undefined,并且在使用诸如express.json()或的正文解析中间件时进行填充express.urlencoded()
以下示例说明如何使用正文解析中间件进行填充req.body

  1. var express = require('express')
  2. var app = express()
  3. app.use(express.json()) // for parsing application/json
  4. app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
  5. app.post('/profile', function (req, res, next) {
  6. console.log(req.body)
  7. res.json(req.body)
  8. })

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

包含从HostHTTP标头派生的主机名。
如果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-Forclient, proxy1, proxy2req.ips将是 ["client", "proxy1", "proxy2"],其中proxy2是最下游。

req.method

包含对应于该请求的HTTP方法的字符串: GETPOSTPUT,等。

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.baseUrlreq.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)

根据请求的AcceptHTTP标头字段检查指定的内容类型是否可接受。该方法返回最佳匹配,或者如果指定的内容类型都不可接受,则返回 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-CharsetHTTP标头字段,返回指定字符集的第一个可接受的字符集。如果不接受任何指定的字符集,则返回false
有关更多信息,或者如果您有任何问题或疑虑,请参阅接受

req.acceptsEncodings(encoding [, …])

根据请求的Accept-EncodingHTTP标头字段,返回指定编码的第一个接受的编码。如果不接受任何指定的编码,则返回false
有关更多信息,或者如果您有任何问题或疑虑,请参阅接受

req.acceptsLanguages(lang [, …])

根据请求的Accept-LanguageHTTP标头字段,返回指定语言的第一种可接受的语言。如果不接受任何指定的语言,则返回false
有关更多信息,或者如果您有任何问题或疑虑,请参阅接受

req.get(field)

返回指定的HTTP请求标头字段(不区分大小写的匹配)。在ReferrerReferer领域是可以互换的。

req.get('Content-Type')
// => "text/plain"
req.get('content-type')
// => "text/plain"
req.get('Something')
// => undefined

别名为req.header(field)

req.is(type)

如果传入请求的“ Content-Type” HTTP标头字段与type参数指定的MIME类型匹配,则返回匹配的内容类型。如果请求没有正文,则返回nullfalse否则返回。

// 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.paramsreq.bodyreq.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.bodyreq.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
    })
    }