Est-ce que quelqu’un connait un moyen dans express.js de capturer des requêtes dans une seule fonction à la fois pour HTML et JSON?
En gros, je veux un seul itinéraire pour /users
et /users.json
– comme le font les rails avec ses itinéraires -> contrôleur.
De cette façon, je peux encapsuler la logique dans une seule fonction et décider de restituer soit HTML, soit JSON.
Quelque chose comme:
app.get('/users[.json]', function(req, res, next, json){ if (json) res.send(JSON.ssortingngfy(...)); else res.render(...); //jade template });
Puis-je utiliser un param peut-être?
Un itinéraire est simplement une chaîne qui est compilée en RegExp en interne, comme le dit le manuel, afin que vous puissiez faire quelque chose comme ceci:
app.get("/users/:format?", function(req, res, next){ if (req.params.format) { res.json(...); } else { res.render(...); //jade template } });
Vérifiez plus ici: http://expressjs.com/guide.html#routing
Je pense que res.format () est le moyen de le faire dans Express 3.x et 4.x:
res.format({ text: function(){ res.send('hey'); }, html: function(){ res.send('hey'); }, json: function(){ res.send({ message: 'hey' }); } });
Cela dépend de l’en-tête Accept, mais vous pouvez lui-même utiliser cet en-tête en utilisant un middleware personnalisé ou quelque chose comme connect-acceptoverride .
Un exemple de middleware personnalisé pourrait être:
app.use(function (req, res, next) { var format = req.param('format'); if (format) { req.headers.accept = 'application/' + format; } next(); });
Je n’étais pas heureux avec les réponses ci-dessus. Voici ce que j’ai fait à la place. S’il vous plaît voter si cela vous aide.
Je m’assure simplement que l’en-tête Content-Type de toutes les demandes JSON est défini sur ‘application / json’.
if (req.header('Content-Type') == 'application/json') { return res.json({ users: users }); } else { return res.render('users-index', { users: users }); }