2016-05-31 8 views
1

die express content negotiator Saw und ich will Verwendung Antworten zu handhaben auf Content-Header abhängig, die in kam.res.format Unterhändler mit Express Router get Post

Zum Beispiel, das ist mein .get().

authRoute.route('/login') 
.get(function(req, res) { 
    res.format({ 
    'text/html': function() { 
     res.render('login', { 
     user: req.user, 
     error: req.flash('error'), 
     loginMessage: req.flash('loginMessage'), 
     active: 'login' 
     }); 
    }, 
    'application/json': function() { 
     res.json({ 
     message: 'This is login page' 
     }) 
    } 
    }) 
}) 

Alles, was ich zu tun bin versucht, wenn der Request-Header ist Standard text/html, sollte es die HTML-Seite und eine JSON-Antwort zeigen, wenn Anfrage application/json ist.

Problem ist, es fängt nicht die Überschriften richtig ab. Obwohl ich die Anfrage (via Postman) machen, die Header Einstellung der application/json zu sein, zeigt es nach wie vor die erste Bedingung in der res.format({..})

Die obige immer zeigt text/plain stattdessen die richtige Bedingung entsprechen.

Irgendwelche Hilfe bei dem, was ich falsch mache?

authRoute.route('/login') 

.... 

.post(passport.authenticate('local-signup', { 
    successRedirect: '/profile', // redirect to the secure profile section 
    failureRedirect: '/register', // redirect back to the signup page if there is an error 
    failureFlash: true // allow flash messages 
})) 

Antwort

2

Meine Vermutung ist, dass Sie den falschen Header in der Anforderung verwendet werden kann (vielleicht Content-Type?). Sie müssen den Header Accept verwenden. Auch Ihr Text sagt json/application; das sollte natürlich application/json sein.

Ich benutze Postman nicht, aber cURL funktioniert es ganz gut:

$ curl -H'Accept:application/json' http://localhost:3000 
+0

es natürlich war ein Tippfehler, der 'JSON/Anwendung' in der Frage. Vielen Dank. Ich habe Content-Type gesendet, also warum Express nicht abholen konnte. Versucht mit Accept und funktioniert. – Rexford

0

Beispiel-Demo mit req.headers

var express = require('express'); 
var app = express(); 

app.get('/', function (req, res) { 
    var contentType = req.headers['content-type']; 
    if(contentType === 'application/json') { 
     return res.json({ 
      message: 'This is login page' 
     }); 
    } 
    res.render('login', { // if not explicitly set, return default render 
     user: req.user, 
     error: req.flash('error'), 
     loginMessage: req.flash('loginMessage'), 
     active: 'login' 
    }); 
}); 

app.listen(3001, function() { 
    console.log('open localhost:3001'); 
}); 

-Test in curl

curl localhost:3001 -H "content-type: application/json" 
+0

'Content-Type' wird verwendet, um den Inhaltstyp des Anforderungshauptteils anzugeben. Es ist nicht zur Inhaltsverhandlung gedacht. – robertklep