Laravel 5 App - AJAX 发布请求不接受令牌并引发 500 内部服务器错误

Posted

技术标签:

【中文标题】Laravel 5 App - AJAX 发布请求不接受令牌并引发 500 内部服务器错误【英文标题】:Laravel 5 App - AJAX Post Request not accepting the token and throwing a 500 internal server error 【发布时间】:2019-01-05 03:42:50 【问题描述】:

所以,我在这 3 个小时的大部分时间里一直在寻找我的代码为什么不起作用。我不认为我的 ajax 请求正在检测我的 CSRF 令牌,即使我已经尝试了多种方法来实现它。刚接触 AJAX 请求,所以很容易。

目标: 向 /email/subscribe/ 提交 ajax POST 请求,并将用户提供的电子邮件地址添加到 email_subscribers 表中。

我已尝试将以下内容添加到我的代码中以显示令牌:

元标记和 Ajax 设置。

文件顶部

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

在 jquery $(document).ready() 函数内的脚本标记中

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

隐藏的输入框

我还添加了一个隐藏的输入字段,并尝试将令牌插入到 ajax 帖子内的数据对象中。

html

&lt;input type="hidden" id="token" value=" csrf_token() "&gt;

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

这是我的 web.php 文件

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

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

);

和我的 EmailSubscriptionsController

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

真正奇怪的是,当我在控制器内的subscribe() 函数中提交请求时,除了以下内容之外什么都没有:

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

它不会返回错误......只是将成功消息传递到控制台。我不确定我做错了什么,因为我在我网站的另一部分有这个工作(一个 ajax 发布请求)。

【问题讨论】:

我意识到这是因为我的 EmailSubscription 模型发布到了错误的表格。谢谢你!把它变成一个答案,我会给你信任。 :P 【参考方案1】:

首先在storage/logs/laravel.log 中查找异常堆栈跟踪。这应该可以更清楚地表明失败的原因。

网络检查器还允许您查看通常包含跟踪的响应。

500 个 ISE 的常见原因是通过 use 不正确地导入类。

【讨论】:

【参考方案2】:

像这样使用它:-

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

【讨论】:

这不是问题的原因

以上是关于Laravel 5 App - AJAX 发布请求不接受令牌并引发 500 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.7 Ajax 发布请求返回 419 状态码

Laravel 5 异步 AJAX 请求导致会话问题

Laravel 5.4 的 Ajax 请求

从ajax请求下载laravel pdf文件(laravel 5)

本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常

在 Laravel 5.1 中请求 ajax 文件不控制 PHP?