it-swarm.com.de

WP REST Rückgabewert der Fehlerfunktion von Request

Mit der Hilfe von WP.SE habe ich gelernt, wie Daten von einem Formular an WP_REST gesendet werden, aber jetzt habe ich ein Problem mit der Rückgabe eines benutzerdefinierten Fehlers. Ich kann Informationen erfolgreich an den WP_REST_Response übergeben und habe einen Check-in WP_REST_Response hinzugefügt. Ich möchte, dass die Fehlermeldung wieder an die Fehlerfunktion AJAX zurückgegeben wird, aber es treten Probleme auf.

Zum Beispiel auf meiner lokalen Box ist die IP ::1 und wenn ich eine Funktion in PHP erstelle:

function ipAddress() {
    if (isset($_SERVER['REMOTE_ADDR'])) :
        $ip_address = clean($_SERVER['REMOTE_ADDR']);
    else :
        $ip_address = "undefined";
    endif;
    return $ip_address;
}

und nachdem ich recherchiert hatte, wie ich den Scheck zurückgeben sollte, lief ich über:

also habe ich zu meinem WP_REST_Response hinzugefügt:

function vader(\WP_REST_Request $request) {
    if (ipAddress() == "::1") :
        return json_encode(array(
            'error' => 'you are localhost'
            ));
    endif;
}

und in meiner vader.js wenn ich benutze:

error: function(data) {
    throw data.error;
 },

ich habe aber keine Fehler in der Konsole und es wird {"error":"you are localhost"} angezeigt, aber ich möchte nur, dass der Wert zur Fehlerfunktion wechselt.

In der jQuery.ajax () -Dokumentation habe ich statusCode gefunden und bekomme:

if (ek_ip_address() == "::1") :
    return new WP_Error('foo', 'bar', array('status' => 404));
endif;

und:

statusCode: {
    404: function() {
        $('#testForm').append("thrown 404s");
    }
}

Gibt es eine Möglichkeit, error zum Anzeigen zu bringen, oder missverstehe ich AJAX error? Was mache ich falsch und wie kann ich den JSON-Wert von WP_REST_REQUEST zurückgeben lassen, um zur Funktion error zu gelangen?

Ein Ajax-Anruf kann an einen beliebigen Ort gesendet werden. Dies kann ein Server sein, auf dem PHP ausgeführt wird, eine virtuelle lokale Route, die mit C # simuliert wird, oder alles andere. Ajax ist es also egal, wie die Antwort lautet, da es sie nicht versteht.

Wenn Sie any Daten von Ihrem Server zurücksenden, solange der Status 200 ist (oder irgendetwas anderes als ein Fehler), betrachtet das Ajax-Skript dies als eine erfolgreiche Anfrage. Danach liegt es an Ihnen, die Situation basierend auf Ihrer Antwort zu handhaben.

Ein einfaches Beispiel

Ich bin ein Anfänger in englischer Sprache. Ich benutze "error" Word anstelle von "success" und gebe es als Antwort zurück.

$data['status'] = 'error';
$data['message'] = 'Nice! Request has been done.';
return $data;

Der Server hat die Aufgabe erfolgreich ausgeführt, aber den falschen Status gesendet. Wie würde Ajax das wissen?

Der Fehlerabschnitt eines Ajax-Aufrufs gibt an, wann ein Problem bei der Anforderung auftritt, bevor sie beendet ist, und nicht danach. Nachdem die Antwort gesendet wurde, hat Ajax seine Arbeit erledigt, was als erfolgreiche Anfrage angesehen wird.

Beispiel aus dem wirklichen Leben

  1. Nehmen wir an, Sie schreiben einem Freund einen Brief und bitten ihn, sich Ihnen in einem Geschäft anzuschließen. Sie sind der "Benutzer" hier.
  2. Sie geben Ihren Brief dem Postboten zur Zustellung. Der Postbote ist hier die "Ajax" Funktion.
  3. Ihr Freund schreibt ein sehr großes "NEIN" in seine Antwort (wie unhöflich), versiegelt den Brief und gibt ihn an den Postboten zurück. Dein Freund ist der "Server" hier.
  4. Der Postbote liefert Ihnen den Brief zurück. Der Postbote erledigte seine Arbeit, egal wie die Antwort ausfiel. So gilt er als "erfolgreich" einer an seinem Arbeitsplatz. (Vergiss seinen Tipp nicht)
  5. Es liegt an Ihnen zu entscheiden, ob Sie wegen des strengen "NEIN" (Fehlerbehandlung) Ihres Freundes schreien, schreien oder weinen möchten. Es ist nicht das Problem des Postboten.
2
Jack Johansson

Wie Jack richtig bemerkt, werden Sie, da die Anfrage erfolgreich war, niemals in den Rückruf von error geraten. Sie müssen lieber alles verarbeiten, was Ihr Server im success Callback von jQuery.ajax() zurückgegeben hat:

success: (data) => {
    if('error' in data) {
        // server returned `error` property in payload - something is wrong!
    }
}

Wenn Sie ES6 nicht verwenden:

success:function(data) {
    if(data && typeof data.error !== 'undefined') {
        // show error message to user
    }
}
2
montrealist