2017-05-09 2 views
1

Wenn ich meine API treffe, möchte ich meine URL von https://myapp.herokuapp.com/token/aaa.bbb.ccc auf https://myapp.herokuapp.com/messages/:id umleiten. Ich möchte auch meine message AnsichtUmleiten und Rendern mit Express

-Code machen:

app.get('/token/:id' , (req, res) => { 
    var decoded = jwt.verify(req.params.id, 'blabla'); 
    Message.findById(decoded.messageId, (err, message) => { 
    if (err) res.json({error: err}) 
    res.render('message', {message}) 
    }) 
}) 

Hier habe ich meine erfolgreich message Ansicht machen, aber die URL für die unter api ist noch https://myapp.herokuapp.com/token/aaa.bbb.ccc und nicht https://myapp.herokuapp.com/messages/:id

Ein weiterer Versuch:

app.get('/token/:id' , (req, res) => { 
    var decoded = jwt.verify(req.params.id, 'blabla'); 

    Message.findById(decoded.messageId, (err, message) => { 
    if (err) res.json({error: err}) 
    res.redirect('/messages/'+message._id) 
    }) 
}) 

Jetzt ist die URL https://myapp.herokuapp.com/messages/:id, aber die message Ansicht wird nicht gerendert. Es wird ein JSON gerendert, der die folgende Meldung anzeigt:

Wie kann ich auf https://myapp.herokuapp.com/messages/:id umleiten und auch die message Ansicht rendern?

+0

Wird '/ token /: id' durch eine direkte Browser-Anfrage oder durch eine XHR (" AJAX ") Anfrage angefordert? – robertklep

+0

Wörtlich nur von einem Link "click the link' – user2456977

+0

Danke, ich war mir nicht sicher, ob meine Antwort funktionieren würde (es wird nicht, wenn es über XHR angefordert wird). Die 'res.json ({error: err})' ist etwas komisch, wenn sie als normale Browser-Anfrage angefordert wird, klingt aber so, als würde man dort eine Fehlerseite rendern wollen. – robertklep

Antwort

3

Sie sollten zuerst umleiten:

app.get('/token/:id' , (req, res) => { 
    var decoded = jwt.verify(req.params.id, 'blabla'); 

    Message.findById(decoded.messageId, (err, message) => { 
    if (err) return res.json({error: err}); // see @partycoder's answer 
    res.redirect('/messages/'+message._id) 
    }) 
}) 

Als nächstes müssen Sie für /messages/:id die Route Handler einzustellen. Im Moment klingt es so, als ob es nur für XHR-Anfragen verwendet wird, daher wird immer JSON zurückgegeben. Sie können einen Scheck zu sehen hinzufügen, wenn die Anfrage eine XHR-Anforderung ist oder nicht, und entweder Rückkehr JSON (für XHR) oder eine gerenderte Vorlage (für Nicht-XHR):

app.get('/messages/:id', (req, res) => { 
    ... 
    if (req.xhr) { 
    return res.json(...); 
    } else { 
    return res.render(...); 
    } 
}); 

(documentation for req.xhr, beachten Sie, dass die Methode, auf der dies basiert, ist nicht narrensicher)

Vielleicht ist es jedoch besser, Content-Negotiation zu verwenden, wobei der Client dem Server explizit mitteilt, welches Format die Antwort sein soll. Der Vorteil davon ist, dass es viel expliziter ist, der Nachteil ist, dass Sie möglicherweise etwas clientseitigen Code ändern müssen. Dokumentation hier: http://expressjs.com/en/4x/api.html#res.format

+0

Danke, es funktioniert wunderbar – user2456977

Verwandte Themen