2014-08-28 4 views
1

J'ai une application web basée sur node.js, express, angulaire (avec routes) et mongo. L'authentification est gérée via Passport.js.Le res.render Express ne fonctionne pas avec le routage angulaire

Mes vues angulaires interagissent avec le serveur via des requêtes http. Dire que j'envoie une requête de type:

$http.get('/api/getMyData').success(function(data) {})... 

sur le serveur je:

app.get('/api/getMyData',function(req, res) { 
    if(!req.user){ 
    // if the session expired 
    res.render('login.ejs',{message:'Session expired. Please login again.'}); 

Avec ce code, je voudrais que l'utilisateur soit redirigé vers la page de connexion si la session a expiré.

Maintenant, cela ne fonctionne pas, et je ne suis pas redirigé pour se connecter. Même si j'ai console.log(req.user) produisant undefined et req.user==undefined donnant true, le res.render dans le if ne fonctionne pas. Et si j'essaye avec res.redirect('login'); j'obtiens une erreur 404 disant que /api/login n'existe pas. Je suis vraiment perdu avec cela, toute aide serait grandement appréciée.

+0

vous ne voulez pas dire res.render? (votre titre) –

+0

Titre modifié, merci. – ZzKr

Répondre

0

J'ai implémenté quelque chose de similaire à ce que suggéraitJordonias. Je reçois l'utilisateur du serveur (null si la session a expiré), et si l'utilisateur est null, j'utilise $window.location.href="/login"; pour se déconnecter de l'utilisateur. Merci à @Jordonias. De meilleures alternatives sont les bienvenues.

2

Votre $http.get() récupère le contenu de res.render(). Vous pouvez voir ceci en ajoutant console.log(data); dans $http.get().success() Vous devrez ajouter une certaine logique à votre client pour rediriger s'il y a une erreur de l'API.

Quelque chose comme:

server.js

app.get('/api/getMyData', function(req, res) { 
    if(!req.user) { 
    res.status(401); 
    return res.json({ 
     status: 'error', 
     message: 'Unauthorized' 
    }); 
    } 
    return res.json({ 
    status: 'success', 
    // Stuff 
    }); 
} 

angulaire

$http.get('/api/getMyData').success(function(data) { 
    // Do something 
}).error(function(data, status) { 
    // Handle the error 
}); 

Note: Ceci est non testé, mais il vous donnera une idée générale. Il pourrait y avoir une solution plus élégante.

+0

Merci pour le commentaire. Je vois que cela pourrait être une solution. Dites que je reçois un json avec le statut: erreur, comment puis-je rediriger de angulaire à une page de connexion comme login.ejs, avec un certain message (le pense que je voulais faire dans le si dans le message original)? Dans tous les cas, je ne comprends toujours pas pourquoi res.render ne fonctionne pas dans ce cas. – ZzKr

+0

Créez un itinéraire pour ** login.ejs ** (/ login) et faites quelque chose comme '$ location.path (url);' puis '$ scope. $ Apply();' – Jordonias

Questions connexes