Laravel数据表无效的JSON响应

时间:2016-05-11 13:51:44

标签: javascript json laravel response middleware

下面的代码一切正常,可以获取用户日志:

JS:

<script>
$(document).ready(function () {
    var table =$('#systemLogs').DataTable({
        responsive: true,
        processing: true,
        serverSide: true,
        "language": {
            "url": "/datatables/media/plug-in/Persian.json"
        },
        ajax: '{!! url('/admin/systemLogs/data/systemLogsDataTable') !!}',
        columns: [
            { data: 'name', name: 'name' },
            { data: 'message_text', name: 'message_text' },
            { data: 'remote_addr', name: 'remote_addr' },
            { data: 'log_created_at', name: 'management_logs.created_at' },
            { data: 'log_updated_at', name: 'management_logs.updated_at' },
        ]
    });
});
</script>

路线:

Route::get('/systemLogs/data/systemLogsDataTable','SystemLogsController@systemLogsDataTable');

public function systemLogsDataTable()
{
    $logs= ManagementLog::select('management_logs.message_text','management_logs.remote_addr','management_logs.created_at as log_created_at','management_logs.updated_at as log_updated_at','managements.name')->leftJoin('managements','management_logs.management_id','=','managements.id');
    return Datatables::of($logs)->make(true);
}

它对我来说很好但是当我想从数据库中获取2个字段时它会给我

  

DataTables警告:table id = systemLogs - JSON响应无效。

但有时它会正常工作。

<script>
$(document).ready(function () {
    var table =$('#systemLogs').DataTable({
        responsive: true,
        processing: true,
        serverSide: true,
        "language": {
            "url": "/datatables/media/plug-in/Persian.json"
        },
        ajax: '{!! url('/admin/systemLogs/data/systemLogsDataTable') !!}',
        columns: [
            { data: 'name', name: 'name' },
            { data: 'message_text', name: 'message_text' },
        ]
    });
});
</script>

我已经了解问题来自中间件:

public function handle($request, Closure $next,$guard = 'admin')
{
    if(!Auth::guard($guard)->check()){
        return redirect('/administrator/logout');
    }else{
        return $next($request);
    }
}

当我把它改为:

public function handle($request, Closure $next,$guard = 'admin')
{
    return $next($request);
}

它运行正常,这意味着问题来自AJAX。 我该怎么办?

2 个答案:

答案 0 :(得分:0)

这是因为如果你没有登录到应用程序,响应将是一个重定向,这是一个无效的AJAX响应,你可以尝试这个来处理重定向响应:

$(document).ready(function () {
    var table =$('#systemLogs').DataTable({
        responsive: true,
        processing: true,
        serverSide: true,
        "language": {
            "url": "/datatables/media/plug-in/Persian.json"
        },
        ajax: function(data, callback, settings) {
            // make a regular ajax request
            $.get('{!! url('/admin/systemLogs/data/systemLogsDataTable') !!}', function(res) {
                if(res.redirect)
                    window.location.href = res.redirect;

                callback({
                    data: JSON.parse(res)
                });
            });
        },
        columns: [
            { data: 'name', name: 'name' },
            { data: 'message_text', name: 'message_text' },
            { data: 'remote_addr', name: 'remote_addr' },
            { data: 'log_created_at', name: 'management_logs.created_at' },
            { data: 'log_updated_at', name: 'management_logs.updated_at' },
        ]
    });
});

答案 1 :(得分:0)

首先,你使用的是php artisan服务吗?我想是的,所以我建议你使用homestead / valet或任何apache / nginx堆栈。

在使用工匠服务时,Laravel会随机返回redirect / 404响应,这是一个已知的奇怪错误。

- 编辑 -

更新了包文档并告知已知错误。 https://github.com/yajra/laravel-datatables#php-artisan-serve-bug