web-dev-qa-db-fra.com

Express ne peut pas PUT/DELETE. Qu'est-ce qui ne va pas?

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.

14
Daniel Tate

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

9
user568109

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')
3

À 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.

1
Dan Ross

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. 

0
Anthony Cantellano