dans express.js, un moyen de capturer une demande à la fois json et html en une seule fonction?

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 }); }