RESTful Express Mongoose & Backbone – Backbone model.remove () non funziona

Sto sviluppando un’app Node usando Express, Mongoose e Backbone con Marionette.

Tutte le rotte funzionano bene eccetto il percorso di cancellazione.

Se chiamo this.model.destroy, ottengo sempre questo errore:

DELETE http://localhost:3000/api/user 404 (Not Found) 

Il 404 viene restituito nel percorso di cancellazione di Express, come se Express non lo supportasse, ma ho visto numerosi esempi sul web che lo utilizzavano.

Ecco la mia configurazione:


Schema di Mongoose:

 var UserSchema = new mongoose.Schema( { name: String, email: String, age: Number }); User = mongoose.model('User', UserSchema); 

ExpressJS Route: (non funzionante)

 app.del('/api/user/:id', user.remove); 

O

 app.delete('/api/user/:id', user.remove); 

Questa rotta è chiamata da backbone model.destroy (), ma restituisce l’errore 404.


Controller user.js ExpressJS: (funziona ma non è stato raggiunto a causa del 404 prima)

 exports.remove = function(req, res) { var id = req.params.id; User.findById(req.params.id, function(err, user) { user.remove(function(err) { if(err) res.json(err); res.json('all good'); }); }); }; 

Modello BackboneJS

 var User = Backbone.Model.extend({ idAttribute: "_id", url: '/api/user/', }); 

Vista client BackboneJS

 var UserView = Backbone.Marionette.ItemView.extend( { template: Handlebars.compile($('#userView').html()), events: { 'click .delete-button': 'deleteUser' }, deleteUser: function(event) { this.model.remove(); } }); 

Ottengo sempre questo errore:

 DELETE http://localhost:3000/api/user 404 (Not Found) 

TUTTAVIA funziona se uso questa chiamata diretta ajax:

 jQuery.ajax({ url:'/api/user/' + this.model.id, type: 'DELETE', success:function(data, textStatus, jqXHR) { } }); 

Quindi, perché funziona se chiamo il percorso via Ajax, se Backbone internamente usa anche Ajax? Perché Backbone non riesce a creare un modello model.destroy () così semplice?

C’è un modo per configurare il metodo Backbone Model.destroy per funzionare bene come nell’esempio Ajax sopra? Grazie

Trovato il problema Backbone model.remove () non stava inviando l’id perché stavo usando “url” in questo modo:

 Backbone.Model.extend({ url: '/users', //... }); 

Questo indicherà a Backbone di usare esattamente / gli utenti come l’URL per tutte le azioni.

Per garantire l’invio dell’ID utilizzando “url”, è ansible utilizzare una funzione:

 url: function() { return '/list_items/' + encodeURIComponent(this.id) } 

O meglio ancora usa “urlRoot” invece di “url”, lascia che la funzione “url” predefinita aggiunga l’id:

 urlRoot: '/users' 

Funzionando come un fascino con urlRoot