2012-01-19 18 views
24

¿Alguien sabe una forma de express.js para capturar las solicitudes en una única función para HTML y JSON?en express.js, ¿hay alguna manera de capturar la solicitud para json y html en una función?

Básicamente, quiero una ruta única para /users y /users.json - como lo hace rails con sus rutas -> controlador.

De esa manera, se puede encapsular la lógica en una sola función y decidir que HTML o JSON.

Algo así como:

app.get('/users[.json]', function(req, res, next, json){ 
    if (json) 
    res.send(JSON.stringfy(...)); 
    else 
    res.render(...); //jade template 
}); 

podría utilizar un parámetro, tal vez?

+0

¿Qué tal hacer 2 rutas? – clyfe

+3

¿Por qué no una ruta con negociación de contenido? (Dicho en la voz de Zoidberg.) –

+0

autor de expreso recomienda que utilice la negociación de contenido: https://github.com/visionmedia/express/issues/1340 –

Respuesta

19

Una ruta es sencilla una cadena que se compila a una expresión regular internamente, como dice el manual, por lo que puede hacer algo como esto:

app.get("https://stackoverflow.com/users/:format?", function(req, res, next){ 
    if (req.params.format) { res.json(...); } 
    else { 
    res.render(...); //jade template 
    } 
}); 

Consulte más aquí: http://expressjs.com/guide.html#routing

+5

ah derecha - encontrado la respuesta en la guía expreso. app.get ('/ users.:format?', function (req, res) {if (req.params.format == 'json') res.send (JSON.stringify (...)); else res. render (...); // plantilla de jade}); – justinjmoses

+0

acabo de encontrarlo al mismo tiempo, pero aprecio la respuesta. – justinjmoses

+1

en caso de que alguien se encuentre con este problema como yo, asegúrese de que su ruta se defina como /users.:format? y no/usuarios: formato? si quieres diferenciar usuarios vs users.json. De lo contrario, deberá especificar users/json. – emilebaizel

49

creo res.format() es la manera de hacerlo in exprés 3.xy 4.x:

res.format({ 
    text: function(){ 
    res.send('hey'); 
    }, 

    html: function(){ 
    res.send('<strong>hey</strong>'); 
    }, 

    json: function(){ 
    res.send({ message: 'hey' }); 
    } 
}); 

esto se basa en la cabecera Accept, sin embargo se puede munge esta cabecera sí mismo utilizando una middleware personalizado o algo así como connect-acceptoverride.

Un ejemplo de un middleware personalizado puede ser:

app.use(function (req, res, next) { 
    var format = req.param('format'); 

    if (format) { 
    req.headers.accept = 'application/' + format; 
    } 

    next(); 
}); 
+0

esto funciona pero requiere que el cliente configure el encabezado Aceptar. mucho más simple de manejar como lo menciona en los comentarios anteriores. – emilebaizel

+0

@emilebaizel: respondiste a tu comentario en mi reciente edición. :) – Beau

+0

astuto middleware! – emilebaizel

0

yo no estaba contento con las respuestas anteriores. Esto es lo que hice en su lugar. Por favor vota si te ayuda.

Yo sólo asegúrese de que todas las peticiones JSON tienen la cabecera Content-Type establecido en 'application/json'.

if (req.header('Content-Type') == 'application/json') { 
    return res.json({ users: users }); 
} else { 
    return res.render('users-index', { users: users }); 
} 
Cuestiones relacionadas