The Express response object lets us send a response to the client.
Various kinds of responses like strings, JSON, and files can be sent. Also, we can send various headers and status code to the client in addition to the body.
In this article, we’ll look at various properties of the response object, including files and JSON responses.
Methods
res.download
res.download
sends a file response to the server.
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.download('./public/foo.txt');
})
app.listen(3000, () => console.log('server started'));
Then when a request is made to this route, then we’ll get a file downloaded.
We can save a file with a different than the file on the server by writing:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.download('./files/foo.txt', 'foobar.txt');
});
app.listen(3000, () => console.log('server started'));
The file foo.txt
from the server will be saved as foobar.txt
by the client.
The download
method also takes an error handler in case the download response fails.
For example, we can handle errors with the built-in error handler as follows:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res, next) => {
res.download('./files/foo.txt', 'foobar.txt', err => next(err));
});
app.listen(3000, () => console.log('server started'));
We called next
with the error object passed in to pass it onto the error handler.
res.end([data] [, encoding])
res.end
ends the response process. The method comes from response.end()
of the http
module.
We can use it to end the response without sending any data. To respond with data, we can use res.send()
or other methods.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.status(404).end();
});
app.listen(3000, () => console.log('server started'));
Then we sent a 404 response back to the client with no data.
res.format(object)
The res.format
method takes the Accept
HTTP header from the request object and use res.accepts
to select a handler for the request.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.format({
'text/plain': () => {
res.send('hi');
}, 'text/html': () => {
res.send('<p>hi</p>');
}, 'application/json': () => {
res.json({ message: 'hi' });
}, 'default': () => {
res.status(406).end();
}
})
});
app.listen(3000, () => console.log('server started'));
If we send a GET request to /
with Accept
header’s value set to text/plain
, we get hi
. If we send text/html
as the Accept
header’s value, we get <p>hi</p>
, and so on.
default
specifies the default response if none of the response types are matched.
It’ll work even if we abbreviate the MIME type names to something shorter:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.format({
text: () => {
res.send('hi');
}, html: () => {
res.send('<p>hi</p>');
}, json: () => {
res.json({ message: 'hi' });
}, default: () => {
res.status(406).end();
}
})
});
app.listen(3000, () => console.log('server started'));
Then we get the same thing as before.
res.get(field)
The get
method returns the HTTP response header specified by field
. The match isn’t case sensitive.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.send(res.get('Content-Type'));
});
app.listen(3000, () => console.log('server started'));
res.json([body])
res.json
lets us send a JSON response to the client. The parameter can be any JSON type, including object, array, string, Boolean, number, or null.
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({ message: 'hi' });
})
app.listen(3000, () => console.log('server started'));
Then we get:
{"message":"hi"}
as the response.
res.jsonp([body])
We can use this to send a JSON response with JSONP support. It returns a callback with the JSON body passed in.
For example, we can use it as follows:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.jsonp({ user: 'foo' });
});
app.listen(3000, () => console.log('server started'));
If we send a GET request with ?callback=cb
as the query string, then we get:
// typeof cb === 'function' && cb({"user":"foo"});
as the response. If we leave out the callback
search parameter, then we get a normal JSON response:
{
"user": "foo"
}
Conclusion
We can send various kinds of responses easily with the response object.
To send files, we can use download
.
To send different things according to the Accept
request header, we can use the format
method.
Finally, to send JSON, we can use the json
or jsonp
methods depending on if we need to call a callback function on the client or not.