Ok, j'ai donc une simple application node.js/express.js/mongodb installée ici avec ma config comme suit .
var express = require('express'),
mongoose = require('mongoose');
http = require('http');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
//middleware stack
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + "/public"));
});
mongoose.connect("mongodb://localhost/hello");
Le problème réside lorsque j'essaie de faire des requêtes PUT ou DELETE. Ma forme est aussi simple
<form method="POST" action="/users/#{user.name}">
<input type="hidden" name="_method" value="PUT"/>
</form>
Maintenant, mon routeur attrape la route avec la méthode express .put ()
app.put('/users/:name', function(req, res) {
var b = req.body;
Users.update(
{ name: req.user.name },
{ name: b.name, age: b.age, email: b.email },
function(err) {
res.redirect('/users/'+b.name);
});
})
Lorsque je fais la demande, je reçois simplement une erreur "Cannot PUT" ou "Cannot DELETE".
J'ai essayé de faire cette même demande via le client RESTful de chomes avec le même résultat.
J'ai lu un sujet qui a le même problème que moi, bien que, suite aux commentaires, les réponses n'aient pas résolu mon problème.
Questions que j’ai examinées Le support d’expressjs pour les méthodes delete et put sans methodoverride
Les méthodes PUT, DELETE, HEAD, etc. sont-elles disponibles dans la plupart des navigateurs Web?
Avec quelques autres . J'ai aussi fait référence à la documentation de express.js et de mongo à plusieurs reprises .
Toute aide est appréciée.
Mettre à jour
Comme Jonathan Lonowski l'a fait remarquer, PUT
peut également être utilisé, vous pouvez donc ignorer mon ancienne réponse . Obtenir des erreurs Cannot PUT
ou Cannot POST
signifie que votre rappel ne s'exécute pas correctement. Mon hypothèse est que Users.update
échoue, c'est pourquoi il ne peut ni POST ni PUT. Peux-tu le vérifier.
Ancienne réponse
Essayez de changer cette ligne
app.put('/users/:name', function(req, res) {
à
app.post('/users/:name', function(req, res) {
puisque vous essayez de soumettre le formulaire
Le <form>
que vous avez répertorié dans une vue ou dans un fichier static
se trouve-t-il sous __dirname + "/public"
?
Dans un fichier statique, le #{user.name}
n'est probablement pas remplacé par le user
's name
et sera traité comme un fragment URL .
Le <form>
sera effectivement soumis à /users/
au lieu de /users/:name
puisqu'il s'agit de la path
:
console.log(url.parse('/users/#{user.name}'));
{ hash: '#{user.name}',
pathname: '/users/',
path: '/users/',
href: '/users/#{user.name}' }
Le <form>
doit être généré à partir d'une vue s'il ne l'est pas, car la action
doit être dynamique et pilotée par les données. Avec Jade et en supposant que user
est un membre de locals
, ce serait:
form(method='POST', action='/users/' + user.name)
input(type='hidden', name='_method', value='PUT')
À moins d’une étrange magie au travail, votre formulaire fait une demande POST, pas un PUT. Si vous voulez PUT, je suggérerais d'utiliser la fonction jQuery.ajax
avec un paramètre type: 'PUT'
, tel que cette réponse , à partir d'un gestionnaire de formulaire, voir jQuery.submit
. N'oubliez pas de return false
pour que le formulaire ne soit pas soumis deux fois.
Si votre méthode using remplace, assurez-vous de l'avoir déclarée avant d'utiliser vos itinéraires. C'était le problème que j'avais.