The request object lets us get the information about requests made from the client in middlewares and route handlers.
In this article, we’ll look at the properties of Express’s request object in detail, including getting the request body and cookies.
Request Object
The req
parameter we have in the route handlers above is the req
object.
It has some properties that we can use to get data about the request that’s made from the client-side. The more important ones are listed below.
req.app
The req.app
property holds a reference to the instance of an Express app that’s using the middleware.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('foo', 'bar');
app.get('/', (req, res) => {
res.send(req.app.get('foo'));
})
app.listen(3000);
We ran app.set(‘foo’, ‘bar’);
to set the foo
setting to the value'bar'
, and then we can get the value with req.app
‘s get
method.
req.baseUrl
The req.baseUrl
property holds the base URL of the router instance that’s mounted.
For example, if we have:
const express = require('express');
const app = express();
const greet = express.Router();
greet.get('/', (req, res) => {
console.log(req.baseUrl);
res.send('Hello World');
})
app.use('/greet', greet);
app.listen(3000, () => console.log('server started'));
Then we get /greet
from the console.log
.
req.body
req.body
has the request body. We can parse JSON bodies with express.json()
and URL encoded requests with express.urlencoded()
.
For example, if we have:
const express = require('express')
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.post('/', (req, res) => {
res.json(req.body)
})
app.listen(3000, () => console.log('server started'));
Then when we make a POST request with a JSON body, then we get back the same that we sent in the request.
req.cookies
We can get cookies that are sent by the request with the req.cookies
property.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get('/', (req, res) => {
res.send(req.cookies.name);
})
app.listen(3000);
Then when we send the Cookie
request header with name
as the key like name=foo
, then we get foo
displayed.
req.fresh
The fresh
property indicates that the app is ‘fresh’. App app is ‘fresh’ if the cache-control
request-header doesn’t have a no-cache
directive and any of the following are true
:
if-modified-since
request header is specified andlast-modified
request header is equal to or earlier than themodified
request header.if-none-match
request header is*
if-none-match
request header, after being parsed into its directives, doesn’t match theetag
response header.
We can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.send(req.fresh);
})
app.listen(3000);
Then we should get false
if those conditions aren’t met.
req.hostname
We can get the hostname from the HTTP header with req.hostname
.
When the trust proxy setting doesn’t evaluate to false
, then Express will get the value from the X-Forwarded-Host
header field. The header can be set by the client or by the proxy.
If there’s more than one X-Forwarded-Host
header, then the first one will be used.
For example, if we have:
const express = require('express')
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.get('/', (req, res) => {
res.json(req.hostname)
})
app.listen(3000, () => console.log('server started'));
Then we get the domain name that the app is hosted in if there’re no X-Forwarded-Host
headers and trust proxy doesn’t evaluate to false
.
req.ip
We can get the IP address that the request is made from with this property.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get('/', (req, res) => {
res.send(req.ip);
})
app.listen(3000);
Then we get something like ::ffff:172.18.0.1
displayed.
req.ips
When the trust proxy
setting isn’t false
, this property contains the array of IP address specified by the X-Forwarded-For
request header.
Otherwise, it’s an empty array. The X-Forwarded-For
can be set by the client or the proxy.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.set('trust proxy', true);
app.get('/', (req, res) => {
res.send(req.ips);
})
app.listen(3000);
Then we get the remote IPs from the client or the X-Forwarded-For
header.
req.method
The method
property has the request method of the request, like GET, POST, PUT or DELETE.
Conclusion
The request object has many properties for getting various pieces of information about the HTTP request received.
Third-party middleware like cookie-parser
adds new properties to the request object to get things like cookies data and more.