it-swarm.com.de

Express kann die PUT/DELETE-Methode nicht verwenden. Was läuft schief?

Ok Also ich habe hier eine einfache node.js/express.js/mongodb-App mit meiner Konfig wie folgt eingerichtet .

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");

Das Problem liegt, wenn ich versuche, PUT- oder DELETE-Anforderungen zu stellen. Meine Form ist so einfach

<form method="POST" action="/users/#{user.name}">
    <input type="hidden" name="_method" value="PUT"/>
</form>

Jetzt fängt mein Router die Route mit der express .put () -Methode ab 

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);
        });
})

Wenn ich die Anfrage stelle, bekomme ich einfach die Fehlermeldung "Kann nicht Put" oder "Kann nicht löschen".

Ich habe versucht, dieselbe Anfrage über einen chome RESTful-Client mit demselben Ergebnis zu stellen.

Ich habe ein Thema gelesen, das das gleiche Problem wie ich hat, obwohl die Antworten nach den Kommentaren mein Problem nicht gelöst haben.

Fragen, die ich mir angesehen habe expressjs Unterstützung für Methode delete und ohne methodoverride setzen

Sind die Methoden PUT, DELETE, HEAD usw. in den meisten Webbrowsern verfügbar?

Zusammen mit ein paar anderen .. Ich habe auch mehrmals auf die Dokumentation zu express.js und mongo verwiesen ... Ich kann mir einfach nicht vorstellen, was schief gehen könnte.

Jede Hilfe wird geschätzt.

14
Daniel Tate

Update

Jonathan Lonowski hat darauf hingewiesen, dass PUT auch verwendet werden kann, so dass Sie meine alte Antwort ignorieren können. ________ Wenn Sie Cannot PUT- oder Cannot POST-Fehler erhalten, wird Ihr Callback nicht erfolgreich ausgeführt. Meine Vermutung ist, dass Users.update fehlschlägt, weshalb es nicht POST oder PUT ist. Kannst du das überprüfen.

Alte Antwort

Versuchen Sie, diese Zeile zu ändern

app.put('/users/:name', function(req, res) {

zu 

app.post('/users/:name', function(req, res) {

da Sie versuchen, das Formular abzusenden

9
user568109

Ist der <form>, den Sie in einer Ansicht oder einer static-Datei unter __dirname + "/public" aufgelistet haben?

In einer statischen Datei wird der #{user.name} wahrscheinlich nicht durch die user der name ersetzt und wird als URL-Fragment behandelt.

Der <form> wird tatsächlich an /users/ und nicht an /users/:name übergeben, da dies die path ist:

console.log(url.parse('/users/#{user.name}'));

{ hash: '#{user.name}',
  pathname: '/users/',
  path: '/users/',
  href: '/users/#{user.name}' }

Der <form> sollte aus einer Ansicht generiert werden, wenn dies nicht der Fall ist, da die action dynamisch und datengesteuert sein muss. Mit Jade und der Annahme, dass user ein Mitglied von locals ist, wäre das:

form(method='POST', action='/users/' + user.name)
  input(type='hidden', name='_method', value='PUT')
3

Wenn keine seltsame Magie am Werk ist, fordert Ihr Formular eine POST -Anforderung, keinen PUT. Wenn Sie PUT verwenden möchten, würde ich vorschlagen, die Funktion jQuery.ajax mit einem type: 'PUT'-Parameter zu verwenden, wie diese Antwort von einem Formularhandler aus, siehe jQuery.submit . Vergessen Sie nicht return false, damit das Formular nicht zweimal gesendet wird.

1
Dan Ross

app.post ("/ movies /: id") ist eine Lösung. Wenn Sie weiterhin app.put ("/ movies /: id" verwenden möchten, versuchen Sie Folgendes:

  1. Installiere method-ovveride von npm.
  2. Benötigen Sie es in Ihrer app.js-Datei.
  3. Öffnen Sie das Formular, von dem aus Sie die PUT-Anforderung aufrufen möchten
  4. stellen Sie sicher, dass Ihr Formular die folgenden Attribute aufweist:

    action = "/ movies/<% = movies._id%>? _ method = PUT" method = "POST">

Diese beiden Lösungen haben bei mir funktioniert. Wenn Sie REST folgen, verwenden Sie die Methode-overide, andernfalls erledigt app.post () ebenfalls den Trick

0
Usama

Wenn Ihre Verwendungsmethode überschrieben wird, stellen Sie sicher, dass Sie sie vor der Verwendung Ihrer Routen deklariert haben. Das war das Problem, das ich hatte. 

0

Ändern Sie res.redirect('path') in res.redirect(303, 'path')

Wenn Sie in Put und Delete zur Adresse get umleiten möchten, müssen Sie als ersten Parameter 303 übergeben. ( Quelle )

0
yaya