You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DataTables通过Ajax加载数据遇500错误的解决求助

DataTables 数据无法显示且报HTTP 500错误的排查与解决

问题描述

我想用DataTables展示数据,已经成功获取数据但无法显示,同时收到提示:"HTTP请求返回状态码500",以下是我的前端代码:

<script>
    $('#tap-role-manajemen').addClass('side-menu--active');
    const limit = 10
    const page = 1
    const column = ['nama', 'email', 'nomor_telp', 'roles', 'status'];
    const table = $('#table_roles').DataTable({
        serverSide: true,
        processing: true,
        deferRender: true,
        autoWidth: false,
        dom: `
            <
                <"util grid grid-cols-12 gap-6 mt-5"<"col-span-6"l>>
                <tr>
                <
                    <i><p>
                >
            >`,
        ajax: {
            url: "{{ route('getDataRoles') }}",
            type: 'GET',
            data: function(d) {
                d.limit = d.length;
                d.page = $('#table_roles').DataTable().page() + 1;
                d.nama = d.columns[1].search.value;
                d.email = d.columns[2].search.value;
                d.nomor_telp = d.columns[3].search.value;
                d.roles = d.columns[4].search.value;
                d.status = d.columns[5].search.value;
                //d.column = column[$('#table_roles').DataTable().order().length ? $('#table_roles').DataTable().order()[0][0] : 0];
                d.order = $('#table_roles').DataTable().order().length ? $('#table_roles').DataTable().order()[0][1] : 'asc';
                // console.log(d);
            },
            dataSrc: function(json) {
                json.recordsTotal = json.data.total;
                json.recordsFiltered = json.data.total;
                return json.data.data;
            }
        },
        columns: [{
                data: null,
                render: function(data) {
                    return data;
                },
            },
            {
                data: 'nama'
            },
            {
                data: 'email'
            },
            {
                data: 'nomor_telp'
            },
            {
                data: 'roles'
            },
            {
                data: 'status'
            },
            {
                data: null,
                render: function() {
                    return `
                        <div class="dropdown">
                            <button class="dropdown-toggle btn btn-primary btn-sm" aria-expanded="false" data-tw-toggle="dropdown">
                                <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"
                                    stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                                    <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
                                    <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
                                </svg>
                                <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"
                                    stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                                    <polyline points="6 9 12 15 18 9"></polyline>
                                </svg>
                            </button>
                            <div class="dropdown-menu w-40">
                                <ul class="dropdown-content">
                                    <li> <a href="" class="dropdown-item">Edit Data</a> </li>
                                    <li> <a href="" class="dropdown-item">Hapus Data</a> </li>
                                </ul>
                            </div>
                        </div>
                    `;
                }
            },
            {
                data: null,
                "render": function(data, type, row, meta) {
                    var updatedAt = moment(row.updated.at).format('MMM DD, YYYY @ HH:mm');
                    return updatedAt + ' by ' + row.updated.by;
                }
            }
        ],
        order: [
            [7, 'asc']
        ],
        columnDefs: [{
                orderable: false,
                targets: [0, 6]
            },
            {
                targets: '_all',
                className: 'text-center'
            }
        ],
        initComplete: function() {
            this.api().columns([1, 2, 3, 4, 5]).every(function(colIdx) {
                const column = this;
                const input = `
                        <input type="text" class="form-control">
                    `;

                $(input).appendTo($(column.footer()).empty()).on('keyup', debounce(function() {
                    const val = $.fn.dataTable.util.escapeRegex($(this).val());
                    column.search(val ? val : '', true, false).draw();
                }, 500));
            });
        }
    });
</script>

排查与解决步骤

1. 优先解决后端500错误

HTTP 500是服务器内部错误,和前端代码直接关联较小,先定位后端问题:

  • 查看后端框架的日志文件(比如Laravel项目的storage/logs/laravel.log),搜索getDataRoles路由对应的请求错误信息,常见原因包括SQL语法错误、变量未定义、权限不足、数据查询逻辑错误等。
  • 在浏览器开发者工具的Network面板中,找到该请求并查看Response内容(如果后端开启了调试模式,会返回具体错误栈)。

2. 修正前端代码中的潜在问题

(1)初始化时获取页码的错误

DataTable初始化过程中,$('#table_roles').DataTable()可能无法正确获取实例,导致页码计算错误。替换ajax.data里的页码计算逻辑:

// 原代码
d.page = $('#table_roles').DataTable().page() + 1;
// 替换为
d.page = Math.floor(d.start / d.length) + 1;

直接利用DataTables自带的start(起始行索引)和length(每页条数)参数计算页码,避免实例获取问题。

(2)第一列无意义的render逻辑

第一列直接返回data会把整行数据对象转成字符串显示,建议改成显示行号:

render: function(data, type, row, meta) {
    return meta.row + 1; // 生成从1开始的连续行号
}

(3)日期格式化的容错处理

如果后端返回的row.updated.at为空或格式不合法,moment会抛出错误,添加判断:

var updatedAt = row.updated && row.updated.at ? moment(row.updated.at).format('MMM DD, YYYY @ HH:mm') : 'N/A';

(4)DOM配置语法错误

原dom配置存在无效的HTML标签(如<tr>、<i><p>),语法混乱会导致DataTables布局渲染失败,改成合法的配置:

dom: '<"util grid grid-cols-12 gap-6 mt-5"<"col-span-6"l>>rtip',

dom配置仅支持DataTables的布局标识符(l-每页长度选择器、r-处理状态、t-表格、i-信息栏、p-分页)和自定义容器。

3. 前端调试建议

  • 打开浏览器开发者工具的Console面板,检查是否有JS报错(比如moment未加载、DOM元素不存在等)。
  • 取消ajax.data里的console.log(d);注释,查看发送给后端的参数是否符合预期(比如page、limit、搜索关键词等)。

内容的提问来源于stack exchange,提问作者andre Farhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:09:55