Does anybody know a way in express.js to capture requests in a single function for both html and json?
Essentially I want a single route for both /users
and /users.json
- like rails does with its routes -> controller.
That way, I can encapsulate the logic in a single function and decide to render either html or json.
Something like:
app.get('/users[.json]', function(req, res, next, json){
if (json)
res.send(JSON.stringfy(...));
else
res.render(...); //jade template
});
Could I use a param perhaps?
I believe res.format() is the way to do this in Express 3.x and 4.x:
res.format({
text: function(){
res.send('hey');
},
html: function(){
res.send('<strong>hey</strong>');
},
json: function(){
res.send({ message: 'hey' });
}
});
This relies on the Accept header, however you can munge this header yourself using a custom middleware or something like connect-acceptoverride.
One example of a custom middleware might be:
app.use(function (req, res, next) {
var format = req.param('format');
if (format) {
req.headers.accept = 'application/' + format;
}
next();
});
A route is simple a string which is compiled to a RegExp internally, as the manual says, so you can do something like this:
app.get("/users/:format?", function(req, res, next){
if (req.params.format) { res.json(...); }
else {
res.render(...); //jade template
}
});
Check more here: http://expressjs.com/guide.html#routing
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With