2017-10-15 4 views
-1

J'ai une action où je dois mettre à jour l'entrée MongoDB dont _id champ, ce qui nécessite la suppression ancienne entrée et de faire un nouveau, est côté serveur ici:Backbone et Express: concatinating (duplication) des itinéraires sur res.redirect

exports.update = function(req, res, next){ 
    var outcome = []; 

    outcome.previousId = req.params.id; 
    outcome.newId = req.body.name; 

    var getPreviousRecord = function(callback) { 
    req.app.db.models.AccountGroup 
     .findOne({ _id: req.params.id }) 
     .lean() 
     .exec(function(err, accountGroups) { 
     if (err) { 
      return callback(err, null); 
     } 

     outcome.accountGroups = accountGroups; 
     return callback(null, 'done'); 
     }); 
    }; 

    var makeNewRecord = function(callback) { 
    var permissions = outcome.accountGroups.permissions; 
    var fieldsToSet = { 
     _id: outcome.newId.toLowerCase(), 
     name: outcome.newId, 
     permissions: permissions 
    }; 

    req.app.db.models.AccountGroup 
     .create(fieldsToSet, function(err, record) { 
     if (err) { 
      return callback(err, null); 
     } 

     outcome.record = record; 
     return callback(null, 'done'); 
     }); 
    }; 

    var deletePreviousRecord = function() { 
    req.app.db.models.AccountGroup 
     .findByIdAndRemove(outcome.previousId) 
     .exec(function(err) { 
     if (err) { 
      return next(err); 
     } 

     res.redirect('admin/account-groups/' + outcome.newId + '/'); 
     }); 
    }; 

    var asyncFinally = function(err) { 
    if (err) { 
     return next(err); 
    } 
    }; 

    require('async').series([getPreviousRecord, makeNewRecord, deletePreviousRecord], asyncFinally); 
}; 

il fonctionne très bien, mais je ne peux pas faire ce travail normalement sur le front-end, il me retourne à la fois ancienne route et une nouvelle route, par exemple:

PUT /admin/account-groups/customers22/admin/account-groups/Customers2233/ 404 213.749 ms - 31 

où customers22 est vieux et _id customers2233 est nouveau _id. Si je navigue d'une autre page à une nouvelle entrée, elle obtient la route normalement.

côté client:

(function() { 
    'use strict'; 

    app = app || {}; 

    app.Details = Backbone.Model.extend({ 
    idAttribute: '_id', 
    defaults: { 
     success: false, 
     errors: [], 
     errfor: {}, 
     name: '' 
    }, 
    url: function() { 
     return '/admin/account-groups/'+ app.mainView.model.id +'/'; 
    }, 
    parse: function(response) { 
     if (response.accountGroup) { 
     app.mainView.model.set(response.accountGroup); 
     delete response.accountGroup; 
     } 

     return response; 
    } 
    }); 

    app.DetailsView = Backbone.View.extend({ 
    el: '#details', 
    events: { 
     'click .btn-update': 'update' 
    }, 
    template: Handlebars.compile($('#tmpl-details').html()), 
    initialize: function() { 
     this.model = new app.Details(); 
     this.syncUp(); 
     this.listenTo(app.mainView.model, 'change', this.syncUp); 
     this.listenTo(this.model, 'sync', this.render); 
     this.render(); 
    }, 
    syncUp: function() { 
     this.model.set({ 
     _id: app.mainView.model.id, 
     name: app.mainView.model.get('name') 
     }); 
    }, 
    render: function() { 
     this.$el.html(this.template(this.model.attributes)); 

     for (var key in this.model.attributes) { 
     if (this.model.attributes.hasOwnProperty(key)) { 
      this.$el.find('[name="'+ key +'"]').val(this.model.attributes[key]); 
     } 
     } 
    }, 
    update: function() { 
     this.model.save({ 
     name: this.$el.find('[name="name"]').val() 
     }); 
    } 

    }); 

    app.MainView = Backbone.View.extend({ 
    el: '.page .container', 
    initialize: function() { 
     app.mainView = this; 
     this.model = new app.AccountGroup(JSON.parse(unescape($('#data-record').html()))); 

     // ... 
     app.detailsView = new app.DetailsView(); 
    } 
    }); 

    $(document).ready(function() { 
    app.mainView = new app.MainView(); 
    }); 
}()); 

Il faut probablement déclencher à la fois model.save et model.destroy ou empêcher URL utilisé. Tout conseil sur la façon de le faire est apprécié, merci.

Modifier Juste une erreur de faute de frappe ici qui n'est pas liée à la question, la vérification imprudemment itinéraires, voir comme annulé

Répondre

2

Je crois que le problème est ici:

res.redirect('admin/account-groups/' + outcome.newId + '/'); 

C'est un chemin relatif il sera donc ajouté à l'URL actuelle. Je suppose que vous voulez quelque chose comme ceci:

res.redirect('/admin/account-groups/' + outcome.newId + '/'); 
+0

Vous avez posté deux lignes de code identiques, je n'ai pas vraiment compris ce que vous vouliez dire. Pouvez-vous élaborer, s'il vous plaît? – ASem

+2

Ils ne sont pas identiques. Il y a un '/' supplémentaire au début du second chemin. – skirtle

+0

C'était une erreur, merci – ASem