2 votes

Laravel 5 App - AJAX Post Request n'accepte pas le token et envoie une erreur de serveur interne 500

J'ai donc cherché ici pendant près de 3 heures pourquoi mon code ne fonctionnait pas. Je ne pense pas que ma requête AJAX détecte mon jeton CSRF, même si j'ai essayé de multiples façons de l'implémenter. Je suis novice en matière de requêtes AJAX, alors allez-y doucement.

But : Soumettre une requête POST ajax à /email/subscribe/ et ajouter l'adresse électronique fournie par l'utilisateur au tableau email_subscribers.

J'ai essayé d'ajouter ce qui suit à mon code pour faire apparaître le jeton :

La balise méta et la configuration Ajax.

Haut du dossier

<meta name="csrf-token" content="{{ csrf_token() }}">

Dans la balise script à l'intérieur de la balise jquery $(document).ready() fonction

// CSRF Ajax Token
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

Champ de saisie caché

J'ai également ajouté un champ de saisie caché et essayé d'insérer le jeton dans l'objet de données dans le post ajax.

HTML

<input type="hidden" id="token" value="{{ csrf_token() }}">

Balise Javascript

var token = $('#token').val();
// var token = $('meta[name="csrf-token"]').attr('content'); //Tried this way

$.ajax({
    type: 'POST',
    url: '/email/subscribe/',
    dataType: 'json',
    data: {
        email: email,
        '_token': token,
        // "_token": "{{ csrf_token() }}", //Tried this way as well
        "_method": 'POST',
    },
    success: function (data) {
        // Check Server Side validation
        if($.isEmptyObject(data.errors)){
            console.log(data['success']);
        }else{
            // Validation Failed Display Error Message
            console.log(data.errors);
        }

    },
    error: function (data) {
        console.log(data);
    }
}); // End Ajax POST function

Voici mon web.php fichier

// Email Routes
Route::prefix('email')->group(function() {

    // Create Post Route for subscribing
    Route::post('/subscribe', 'EmailSubscriptionsController@subscribe')->name('email.subscribe');

});

et mon Contrôleur d'abonnements par courriel

class EmailSubscriptionsController extends Controller
{
    // Store the Email into the database
    public function subscribe(Request $request) {

        // Validate the request
        $validator = Validator::make($request->all(), [
            'email' => 'required|email',
        ]);

        // If the validation fails
        if($validator->fails()) {
            return response()->json([
                'errors' => $validator->errors()->all(),
            ]);
        }

        // New Section Object
        $subscription = new EmailSubscription;

        // Add Name into Section Object
        $subscription->email = $request->email;

        // Save the Section
        $subscription->save();

        // Return The Request
        return response()->json([
            'success' => 'Record has been saved successfully!'
        ]);
    } // End Subscribe

} // End Controller

Ce qui est vraiment bizarre, c'est que lorsque je soumets la demande avec RIEN d'autre que ce qui suit dans mon subscribe() dans mon contrôleur :

// Return The Request
    return response()->json([
        'success' => 'Record has been saved successfully!'
    ]);

Il ne renvoie pas d'erreur.... Il transmet simplement le message de réussite à la console. Je ne suis pas sûr de savoir ce que je fais de travers car j'ai réussi à faire fonctionner cela (une requête post ajax) dans une autre partie de mon site.

3voto

DigitalDrifter Points 10485

Commencez par regarder dans storage/logs/laravel.log pour la trace de la pile de l'exception. Cela devrait donner une indication plus claire de ce qui échoue.

L'inspecteur web vous permet également de voir la réponse, qui comprend généralement la trace.

Une cause fréquente de 500 ISE est l'importation incorrecte de classes par l'intermédiaire de use .

-1voto

Sandeep Bangarh Points 10

Utilisez-le comme ceci:-

headers: {
        'X-CSRF-TOKEN': '{{ csrf_token() }}'
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X