Request Object
The req object represents the HTTP request and has properties for the
request query string, parameters, body, HTTP headers, and so on. In this documentation and by convention,
the object is always referred to as req (and the HTTP response is res) but its actual name is determined
by the parameters to the callback function in which you’re working.
For example:
app.get('/user/:id', function (req, res) { res.send('user ' + req.params.id);});But you could just as well have:
app.get('/user/:id', function (request, response) { response.send('user ' + request.params.id);});The req object is an enhanced version of Node’s own request object
and supports all built-in fields and methods.
Properties
The req object contains a number of properties that provide information about the HTTP request, such as headers, query parameters, and more.
Caution
In Express 4, req.files is no longer available on the req object by default. To access uploaded files
on the req.files object, use multipart-handling middleware like multer, multiparty, busboy,
formidable,
or pez.
req.app
This property holds a reference to the instance of the Express application that is using the middleware.
If you follow the pattern in which you create a module that just exports a middleware function
and require() it in your main file, then the middleware can access the Express instance via req.app
For example:
app.get('/viewdirectory', require('./mymiddleware.js'));module.exports = function (req, res) { res.send('The views directory is ' + req.app.get('views'));};req.baseUrl
The URL path on which a router instance was mounted.
The req.baseUrl property is similar to the mountpath property of the app object,
except app.mountpath returns the matched path pattern(s).
For example:
var greet = express.Router();
greet.get('/jp', function (req, res) { console.log(req.baseUrl); // /greet res.send('Konnichiwa!');});
app.use('/greet', greet); // load the router on '/greet'Even if you use a path pattern or a set of path patterns to load the router,
the baseUrl property returns the matched string, not the pattern(s). In the
following example, the greet router is loaded on two path patterns.
app.use(['/gre+t', '/hel{2}o'], greet); // load the router on '/gre+t' and '/hel{2}o'When a request is made to /greet/jp, req.baseUrl is “/greet”. When a request is
made to /hello/jp, req.baseUrl is “/hello”.
req.body
Contains key-value pairs of data submitted in the request body.
By default, it is undefined, and is populated when you use body-parsing middleware such
as express.json() or express.urlencoded().
Warning
As req.body’s shape is based on user-controlled input, all properties and values in this object
are untrusted and should be validated before trusting. For example, req.body.foo.toString() may
fail in multiple ways, for example foo may not be there or may not be a string, and toString
may not be a function and instead a string or other user-input.
The following example shows how to use body-parsing middleware to populate req.body.
var express = require('express');
var app = express();
app.use(express.json()); // for parsing application/jsonapp.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
When using cookie-parser middleware, this property is an object that
contains cookies sent by the request. If the request contains no cookies, it defaults to {}.
// Cookie: name=tjconsole.dir(req.cookies.name);// => 'tj'If the cookie has been signed, you have to use req.signedCookies.
For more information, issues, or concerns, see cookie-parser.
req.fresh
When the response is still “fresh” in the client’s cache true is returned, otherwise false is returned to indicate that the client cache is now stale and the full response should be sent.
When a client sends the Cache-Control: no-cache request header to indicate an end-to-end reload request, this module will return false to make handling these requests transparent.
Further details for how cache validation works can be found in the HTTP/1.1 Caching Specification.
console.dir(req.fresh);// => truereq.hostname
Contains the hostname derived from the Host HTTP header.
When the trust proxy setting
does not evaluate to false, this property will instead get the value
from the X-Forwarded-Host header field. This header can be set by
the client or by the proxy.
If there is more than one X-Forwarded-Host header in the request, the
value of the first header is used. This includes a single header with
comma-separated values, in which the first value is used.
Note
Prior to Express v4.17.0, the X-Forwarded-Host could not contain multiple values or be present
more than once.
// Host: "example.com:3000"console.dir(req.hostname);// => 'example.com'req.ip
Contains the remote IP address of the request.
When the trust proxy setting does not evaluate to false,
the value of this property is derived from the left-most entry in the
X-Forwarded-For header. This header can be set by the client or by the proxy.
console.dir(req.ip);// => '127.0.0.1'req.ips
When the trust proxy setting does not evaluate to false,
this property contains an array of IP addresses
specified in the X-Forwarded-For request header. Otherwise, it contains an
empty array. This header can be set by the client or by the proxy.
For example, if X-Forwarded-For is client, proxy1, proxy2, req.ips would be
["client", "proxy1", "proxy2"], where proxy2 is the furthest downstream.
req.method
Contains a string corresponding to the HTTP method of the request:
GET, POST, PUT, and so on.
req.originalUrl
Caution
req.url is not a native Express property, it is inherited from Node’s http
module.
This property is much like req.url; however, it retains the original request URL,
allowing you to rewrite req.url freely for internal routing purposes. For example,
the “mounting” feature of app.use() will rewrite req.url to strip the mount point.
// GET /search?q=somethingconsole.dir(req.originalUrl);// => '/search?q=something'req.originalUrl is available both in middleware and router objects, and is a
combination of req.baseUrl and req.url. Consider following example:
app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new?sort=desc' console.dir(req.originalUrl); // '/admin/new?sort=desc' console.dir(req.baseUrl); // '/admin' console.dir(req.path); // '/new' next();});req.params
This property is an object containing properties mapped to the named route “parameters”. For example, if you have the route /user/:name, then the “name” property is available as req.params.name. This object defaults to {}.
// GET /user/tjconsole.dir(req.params.name);// => 'tj'When you use a regular expression for the route definition, capture groups are provided as integer keys using req.params[n], where n is the nth capture group. This rule is applied to unnamed wild card matches with string routes such as /file/*:
// GET /file/javascripts/jquery.jsconsole.dir(req.params[0]);// => 'javascripts/jquery.js'Named capturing groups in regular expressions behave like named route parameters. For example the group from /^\/file\/(?<path>.*)$/ expression is available as req.params.path.
If you need to make changes to a key in req.params, use the app.param handler. Changes are applicable only to parameters already defined in the route path.
Any changes made to the req.params object in a middleware or route handler will be reset.
Note
Express automatically decodes the values in req.params (using decodeURIComponent).
req.path
Contains the path part of the request URL.
// example.com/users?sort=descconsole.dir(req.path);// => '/users'Note
When called from a middleware, the mount point is not included in req.path. See
app.use() for more details.
req.protocol
Contains the request protocol string: either http or (for TLS requests) https.
When the trust proxy setting does not evaluate to false,
this property will use the value of the X-Forwarded-Proto header field if present.
This header can be set by the client or by the proxy.
console.dir(req.protocol);// => 'http'req.query
This property is an object containing a property for each query string parameter in the route.
When query parser is set to disabled, it is an empty object {}, otherwise it is the result of the configured query parser.
Warning
As req.query’s shape is based on user-controlled input, all properties and values in this object
are untrusted and should be validated before trusting. For example, req.query.foo.toString() may
fail in multiple ways, for example foo may not be there or may not be a string, and toString
may not be a function and instead a string or other user-input.
The value of this property can be configured with the query parser application setting to work how your application needs it. A very popular query string parser is the qs module, and this is used by default. The qs module is very configurable with many settings, and it may be desirable to use different settings than the default to populate req.query:
var qs = require('qs');app.set('query parser', function (str) { return qs.parse(str, { /* custom options */ });});Check out the query parser application setting documentation for other customization options.
req.res
This property holds a reference to the response object that relates to this request object.
req.route
Contains the currently-matched route, a string. For example:
app.get('/user/:id?', function userIdHandler(req, res) { console.log(req.route); res.send('GET');});Example output from the previous snippet:
{ path: '/user/:id?', stack: [ { handle: [Function: userIdHandler], name: 'userIdHandler', params: undefined, path: undefined, keys: [], regexp: /^\/?$/i, method: 'get' } ], methods: { get: true } }req.secure
A Boolean property that is true if a TLS connection is established. Equivalent to:
console.dir(req.protocol === 'https');// => truereq.signedCookies
When using cookie-parser middleware, this property
contains signed cookies sent by the request, unsigned and ready for use. Signed cookies reside
in a different object to show developer intent; otherwise, a malicious attack could be placed on
req.cookie values (which are easy to spoof). Note that signing a cookie does not make it “hidden”
or encrypted; but simply prevents tampering (because the secret used to sign is private).
If no signed cookies are sent, the property defaults to {}.
// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3console.dir(req.signedCookies.user);// => 'tobi'For more information, issues, or concerns, see cookie-parser.
req.stale
Indicates whether the request is “stale,” and is the opposite of req.fresh.
For more information, see req.fresh.
console.dir(req.stale);// => truereq.subdomains
An array of subdomains in the domain name of the request.
// Host: "tobi.ferrets.example.com"console.dir(req.subdomains);// => ['ferrets', 'tobi']The application property subdomain offset, which defaults to 2, is used for determining the
beginning of the subdomain segments. To change this behavior, change its value
using app.set.
req.xhr
A Boolean property that is true if the request’s X-Requested-With header field is
“XMLHttpRequest”, indicating that the request was issued by a client library such as jQuery.
console.dir(req.xhr);// => trueMethods
The req object also contains a number of methods that can be used to perform various tasks related to the HTTP request, such as checking the content type, retrieving header values, and more.
req.accepts(types)
Checks if the specified content types are acceptable, based on the request’s Accept HTTP header field.
The method returns the best match, or if none of the specified content types is acceptable, returns
false (in which case, the application should respond with 406 "Not Acceptable").
The type value may be a single MIME type string (such as “application/json”),
an extension name such as “json”, a comma-delimited list, or an array. For a
list or array, the method returns the best match (if any).
// Accept: text/htmlreq.accepts('html');// => "html"
// Accept: text/*, application/jsonreq.accepts('html');// => "html"req.accepts('text/html');// => "text/html"req.accepts(['json', 'text']);// => "json"req.accepts('application/json');// => "application/json"
// Accept: text/*, application/jsonreq.accepts('image/png');req.accepts('png');// => false
// Accept: text/*;q=.5, application/jsonreq.accepts(['html', 'json']);// => "json"For more information, or if you have issues or concerns, see accepts.
req.acceptsCharsets(charset [, …])
Returns the first accepted charset of the specified character sets,
based on the request’s Accept-Charset HTTP header field.
If none of the specified charsets is accepted, returns false.
For more information, or if you have issues or concerns, see accepts.
req.acceptsEncodings(encoding [, …])
Returns the first accepted encoding of the specified encodings,
based on the request’s Accept-Encoding HTTP header field.
If none of the specified encodings is accepted, returns false.
For more information, or if you have issues or concerns, see accepts.
req.acceptsLanguages([lang, …])
Returns the first accepted language of the specified languages,
based on the request’s Accept-Language HTTP header field.
If none of the specified languages is accepted, returns false.
If no lang argument is given, then req.acceptsLanguages()
returns all languages from the HTTP Accept-Language header
as an Array.
For more information, or if you have issues or concerns, see accepts.
Express (4.x) source: request.js line 179
Accepts (1.3) source: index.js line 195
req.get(field)
Returns the specified HTTP request header field (case-insensitive match).
The Referrer and Referer fields are interchangeable.
req.get('Content-Type');// => "text/plain"
req.get('content-type');// => "text/plain"
req.get('Something');// => undefinedAliased as req.header(field).
req.is(type)
Returns the matching content type if the incoming request’s “Content-Type” HTTP header field
matches the MIME type specified by the type parameter. If the request has no body, returns null.
Returns false otherwise.
// With Content-Type: text/html; charset=utf-8req.is('html');// => 'html'req.is('text/html');// => 'text/html'req.is('text/*');// => 'text/*'
// When Content-Type is application/jsonreq.is('json');// => 'json'req.is('application/json');// => 'application/json'req.is('application/*');// => 'application/*'
// Using arrays// When Content-Type is application/jsonreq.is(['json', 'html']);// => 'json'
// Using multiple arguments// When Content-Type is application/jsonreq.is('json', 'html');// => 'json'
req.is('html');// => falsereq.is(['xml', 'yaml']);// => falsereq.is('xml', 'yaml');// => falseFor more information, or if you have issues or concerns, see type-is.
req.param(name [, defaultValue])
Warning
Deprecated. Use either req.params, req.body or req.query, as applicable.
Returns the value of param name when present.
// ?name=tobireq.param('name');// => "tobi"
// POST name=tobireq.param('name');// => "tobi"
// /user/tobi for /user/:namereq.param('name');// => "tobi"Lookup is performed in the following order:
req.paramsreq.bodyreq.query
Optionally, you can specify defaultValue to set a default value if the parameter is not found in any of the request objects.
Warning
Direct access to req.body, req.params, and req.query should be favoured for clarity - unless you truly accept input from each object.
Body-parsing middleware must be loaded for req.param() to work predictably. Refer req.body for details.
req.range(size[, options])
Range header parser.
The size parameter is the maximum size of the resource.
The options parameter is an object that can have the following properties.
| Property | Type | Description |
|---|---|---|
combine | Boolean | Specify if overlapping & adjacent ranges should be combined, defaults to false. When true, ranges will be combined and returned as if they were specified that way in the header. |
An array of ranges will be returned or negative numbers indicating an error parsing.
-2signals a malformed header string-1signals an unsatisfiable range
// parse header from requestvar range = req.range(1000);
// the type of the rangeif (range.type === 'bytes') { // the ranges range.forEach(function (r) { // do something with r.start and r.end });}