borisbaer: In MVC-Umgebung bei JS-Validierung auf Datenbank zugreifen

Beitrag lesen

Hallo Rolf,

vielen Dank für die ausführliche Erklärung!

Lies Dir mal das hier durch.

Habe ich getan, sehr erhellend, danke!

Du kommst an den Wert also nur heran, wenn Du Dich der Promise-Logik unterwirfst. Du bekommst von checkUser das Promise 3 zurück. Aber in dem Moment, wo es zurückkommt, hat es noch keinen Wert. Du musst Dich also selbst an das Versprechen ranhängen. Mit .then():

checkUser("borisbaer")
.then(function(username) {
   // Ist einer gekommen, dann Kollision melden
});

Ich hab’s, denke ich, verstanden und hingekriegt! Hier wird das auch ganz gut erklärt.

Danke auch für die Erklärungen zu async/await. Um es wirklich zu verstehen, muss ich aber mal bei Gelegenheit mehr zu dem Thema recherchieren.

Übrigens habe ich die verify-Methode so umgeschrieben, dass sie sowohl für den Benutzernamen als auch für die E-Mail-Adresse funktioniert …

public function verify(): never
{
	$attr = array_keys( $_GET )[1] ?? null;
	if ( $attr === 'username' || $attr === 'email' ) {
		$value = \App\Models\User\SignUp::read( [ $attr => $_GET[$attr] ] );
		header( 'Content-Type: application/json' );
		echo json_encode( [ 'value' => $value ] );
		exit;
	} else {
		header( 'Location: user' );
		exit;
	}
}

Die Javascript-Funktion sieht dann entsprechend so aus:

async function verify( input, value ) {
	try {
		const response = await fetch( `/verify?${input.name}=${encodeURIComponent( value )}` );
		if ( !response.ok )
			throw `${response.status} ${response.statusText}`;
		const json = await response.json();
		return json.value;
	} catch ( error ) {
		console.log( error );
		return null;
	}
}

Das mit header( 'Content-Type: application/json' ) habe ich von einem Tutorial. Es funktioniert aber auch ohne. Gebe ich das also nur für den Browser an?

Grüße
Boris