Expressjs / Node.js - res.redirect() pas de chargement de la page
J'ai une page avec un itinéraire GET /team
qui est du chargement d'une liste d'équipes, et DEL /team
qui est de la suppression d'une équipe de /team/:key
. Si vous accédez à une équipe de la page de profil et supprimer à partir de là, sur la suppression il doit vous rediriger vers la /team
page. J'ai mis des billes dans la console et c'est avec succès la suppression de la team
et wierdly, il dit qu'il est en cours de chargement /team
mais le navigateur ne prend pas en charge cette. J'ai mis mon code ci-dessous, des idées?
Routes:
app.get('/team'/*, lim("Must be logged in to see teams")*/, getAllTeams, function(req, res){
util.log('Serving request for url [GET] ' + req.route.path);
//Pass it the list of all Teams
res.render('team', {'teamsList' : req.teamsList} );
});
app.get('/team/:key', function(req, res) {
util.log('Serving request for url [GET] ' + req.route.path);
Team.findByKey(req.params.key, function(err, teamData){
if(!err && teamData){
teamData = teamData;
res.render('teamDetails', { 'teamData' : teamData } );
} else {
util.log('Error in fetching Team by key : ' + req.params.key);
res.json({
'retStatus' : 'failure',
'msg' : 'Error in fetching Team by key ' + req.params.key
});
}
});
});
/**
* DEL /team/:key
* Delete Team by key
*/
app.del('/team/:key', getAllTeams, function(req, res) {
util.log('Serving request for url [DEL] ' + req.route.path);
Team.remove({key : req.params.key}, function(err){
var message = '';
var retStatus = '';
if (!err) {
util.log('Successfully deleting Team with key: ' + req.params.key);
message = 'Successfully deleting Team with key: ' + req.params.key;
retStatus = 'Success';
res.redirect('/team');
} else {
util.log('Error deleting Team with key: ' + req.params.key + 'Error: ' + util.inspect(err));
res.json({
'retStatus' : 'failure',
'msg' : 'Error in fetching Team with key ' + req.params.key
});
}
});
});
JavaScript + HTML template:
button#teamDelete.btn.btn-danger.btn-mini(type="submit", value="Delete Team") Delete
script(type='text/javascript')
$('#teamDelete').live('click',function(){
var teamId = #{teamData.key};
$.post('/team/' + teamId, { _method : 'delete' }, function(response) {
console.log(response);
if(response.retStatus === 'Success') {
if('/team' && '/team' !== "") {
window.location = '/team';
}
}
});
});
journaux de la console:
10 Mar 11:52:01 - Serving request for url [GET] /team
10 Mar 11:52:02 - Serving request for url [GET] /team/:key
10 Mar 11:52:03 - Serving request for url [DEL] /team/:key
10 Mar 11:52:03 - Successfully deleting Team with key: 1362855941128
10 Mar 11:52:03 - Serving request for url [GET] /team
getAllTeams:
var getAllTeams = function(req, res, next){
Team.getAll(function(err, teamsList){
if(!err && teamsList){
req.teamsList = teamsList;
return next();
}
});
};
De l'équipe.getAll (Équipe schéma)
Team.statics.getAll = function(cb){
var query = this.find({});
query.sort({key : -1});
return query.exec(cb);
};
Le /équipe OBTENIR l'itinéraire attend un paramètre req.teamsList pour le rendu de la page. Est-il offert dans la redirection?
Si j'ajoute dans
Comment voulez-vous l'ajouter à la redirection?
J'ai essayé d'ajouter
Est le /équipe OBTENIR l'itinéraire de travail autonome... si oui, comment sont les paramètres envoyés avec la demande...
Si j'ajoute dans
{'teamsList' : req.teamsList}
la redirection comme je le fais lors du rendu de l' /team
page, et ajouter dans getAllTeams
, rien n'est affiché dans la console, et rien n'est encore chargé.Comment voulez-vous l'ajouter à la redirection?
J'ai essayé d'ajouter
res.render('team', {'teamsList' : req.teamsList} );
mais rien chargé, je ne pense pas que cela fonctionne avec le res.render
mais il ne fonctionne pas avec juste une simple redirection, soit parce qu'il s'attend à une teamsList comme vous l'avez dit, une idée de comment résoudre le problème?Est le /équipe OBTENIR l'itinéraire de travail autonome... si oui, comment sont les paramètres envoyés avec la demande...
OriginalL'auteur germainelol | 2013-03-10
Vous devez vous connecter pour publier un commentaire.
Votre demande est après (en dollars.post) et vous la route est d'application.del, de sorte qu'il n'arrive jamais à res.rediriger l'intérieur de l'app.del itinéraire.
Pourquoi vous n'utilisez pas l'application.post?
Mise à jour:
En supposant $.post envoie HTTP DEL demande ici ce qui se passe: serveur envoie la réponse 302 avec pas de données, mais le navigateur n'envoie jamais une autre requête pour OBTENIR l'itinéraire le serveur indique qu'il (ou jQuery gérer les redirections? Pas sûr). res.redirect() est la véritable réponse HTTP, pas un serveur interne du côté de l'instruction de re-router la demande à un autre itinéraire que vous pouvez le faire dans ASP.NET (et ce qui est faux en fait)... la Route est conçu pour recevoir la demande, la réponse de la réponse et de l'oublier. Vous avez besoin de séparer les routes de fonctions réelles de traitement entre eux, alors vous serez en mesure d'appeler cette fonction, au lieu d'envoyer de redirection.
Code des suggestions
Dans l'app.del('/équipe/:clé' ...
Côté Client en $.post('/équipe/' ...
Pas sûr que cela va fonctionner, mais parce que je ne comprends pas ce que votre
getAllTeams
fait et pourquoi vous stockezteamList
dans req. Si vous voulez stocker dans la session, que de supposer le middleware est correctement configuré, vous devez utiliser req.session. Si vous avez besoin de stocker uniquement dans la demande et votre getAllTeams prépare cette liste des équipes, il est préférable de les stocker dans res.les habitants (comme res.les locaux.teamList).Et assurez-vous que votre getAllTeams appels suivant. Donc, fondamentalement, votre getAllTeams devrait ressembler à ceci:
Et puis vous pouvez utiliser res.les locaux.teamList dans votre gestionnaire d'itinéraire au lieu de req.teamList.
Et "l'équipe" modèle peut également avoir un problème...
Express conseils 🙂
Aussi la façon dont vous utilisez l'Express fait qu'il est très difficile d'étendre/gérer l'application. Je ne me souviens pas exactement où, mais quelque part dans les docs ils écrivent que l'Express est censé être utilisé comme base pour vos cadre d'application, non pas comme un cadre complet comme la plupart des frameworks PHP. Il vous donne beaucoup de puissance et de flexibilité, mais rend également nécessaire de réfléchir sur l'architecture des applications bien à l'avance.
La fonction la plus puissante de l'express, c'est que vous pouvez avoir n'importe quel itinéraire gérée par de nombreuses routes spécifiques, gestionnaires et des middlewares de contrôle de transmission pour chaque autre par l'intermédiaire de next(). J'ai un tableau statique qui définit les gestionnaires sont utilisés sur chaque itinéraire permettant de voir l'ensemble de l'application avec vos 30 itinéraires sur une seule page. Et cette table est utilisée pour assembler le routage de façon dynamique lorsque l'application démarre. Il conduit à beaucoup de flexibilité, de facilité de gestion (je peux me déplacer/copier-coller des gestionnaires d'un itinéraire à l' - chaque gestionnaire est représenté comme un seul mot) et le code de la réutilisation. J'utilise aussi le même hachage de routes définition dans le client pour le côté client de routage.
J'ai juste essayé de faire ce qu'il
app.post
plutôt queapp.del
et la suppression de la_method: delete
de la JS dans la page HTML, mais il est dit encore de routage à/team
sur console, mais rien dans le navigateur. Merci pour les conseils aussi, je vais en tenir compte pour vous.Correct, je suis en utilisant ce.
est un domaine autorisé par le methodOverride middleware fourni par Connect pour NodeJS.
il a obtenu, grâce. Bien que je ne comprends toujours pas pourquoi utiliser ce middleware quand vous pouvez simplement utiliser l'app.post pour traiter une requête post... Seulement si vous avez un peu de travail de l'API utilisée par dire l'application mobile et vous ne voulez pas utiliser la DEL dans le navigateur, mais pas lorsque vous êtes en développement à partir de zéro...
OriginalL'auteur esp
Pour une solution de rechange rapide, il suffit d'ajouter l'url de redirection à la réponse et sur le côté client n':
redirectUrl
avec/team
vous êtes en train de dire?Ne peut toujours pas obtenir que cela fonctionne, vous pouvez voir si vous pouvez le voir rien de mal avec le code HTML?
Quand je vais à la console sur stackoverflow.com et la fenêtre exécuter.emplacement = "/hello"; Il me prend pour stackoverflow.com/hello
OriginalL'auteur Tutan Ramen