2017-08-17 6 views
1

Ich habe eine Einstellungsseite, die Sie einfügen und einige Filter löschen können. Für Löschanfrage verwendete ich dies:Node.Js Versprechen Redirect funktioniert nicht

$('#delete-filter').click(function (e) { 
     var filtername = $('#filter-list').val(); 
     var filterCount = $('#filter-list option').length; 
      var retVal = confirm("Are you sure to delete this filter?"); 
      if(retVal == true){ 
       $.ajax({ 
        url: "/settings?filtername=" + filtername, 
        method: 'DELETE', 
        dataType: "json", 
        success: function (result) { 

        } 
       }); 

      } 
      else{ 
       return false; 
      } 

    }); 

Und hier ist meine Route für diese Seite:

router.delete('/settings', ensureAuthenticated, function (req, res, next) { 
    var promise = user.deleteFilter(req.session.user_id, req.query.filtername); 
    var promise2 = promise.then(function (data) { 
     req.session.selected_filter = data.selected; 
     res.redirect('/settings'); 
    }, function (error) { 
     console.log(error); 
    }) 
}) 

Im Grunde möchte ich Seite Einstellungen umleiten, so dass die Seite neu geladen mit den neuen Daten. Aber in der Versprechungskette kann ich keine Antwortfunktionen verwenden. Benutze ich die Umleitung falsch? oder kann ich keine Antwort in der Versprechungskette senden?

Antwort

3

Sie haben das Problem falsch identifiziert.

Wenn Sie eine HTTP-Weiterleitung ausgeben, sagen Sie "Das, was Sie gesucht haben? Holen Sie es stattdessen von hier."

Dies ist nicht dasselbe wie "Der Browser sollte diese URL als neue Seite anzeigen".

Die HTTP-Weiterleitung folgt, die Einstellungsseite wird an den Browser übermittelt, dann stellt der Browser sie als result in Ihrer Erfolgsfunktion zur Verfügung. (Sie ignorieren es dann vollständig, da Sie nichts in diese Funktion eingefügt haben).

Wenn Sie den Browser wollen eine neue Seite laden, dann müssen Sie die URL als Daten (nicht als Redirect) liefern und dann diesen Wert location.href zuweisen.

Die Einstellungen Seite sollte wahrscheinlich nicht dynamisch bestimmt werden, so dass Sie wahrscheinlich nur die URL hart in die Erfolgsfunktion codieren können.

harte Codierung es würde mehr Sinn machen, da Sie nicht eine Umleitung in Reaktion auf einen DELETE request senden sollen:

Wenn eine DELETE-Methode wird erfolgreich angewandt, der Ursprungsserver sollte sendet einen 202 (Accepted) Statuscode, wenn die Aktion wahrscheinlich erfolgreich ist, aber noch nicht ausgeführt wurde, ein Code code, wenn die Aktion ausgeführt wurde und keine weiteren Informationen oder 200 (OK) Statuscode geliefert werden soll wenn die Aktion ausgeführt wurde und die Antwortnachricht eine Darstellung enthält de Schreiben des Status.

+0

Ich frage mich, woher hast du den Hinweis, dass OP suchte nach "Der Browser sollte diese URL als eine neue Seite anzeigen"? Ich meine, er benutzt Ajax =/ – Salketer

+0

@Salketer - Zitat: "Im Wesentlichen möchte ich auf Seite zu Einstellungen umleiten, so ** die Seite neu geladen ** mit den neuen Daten" – Quentin

+0

Ich habe bereits versucht, 'res.send ({ href: "/ settings"}); 'anstelle von' res.redirect ('/ settings') '. Und wie Sie sagen, ich verwende location.href bei der Erfolgsmethode, aber die Seite wird nicht neu geladen. Es wird geladen und nichts passiert. –