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

Laravel项目中用Axios获取MySQL数据失败,请求排查错误

Laravel博客分类列表展示问题修复方案

核心问题:接口返回格式不匹配

前端JavaScript期望/blogs接口返回JSON格式的分页数据,但当前控制器index方法返回的是视图页面,导致Axios无法解析出data.data结构,直接引发表格渲染失败。

错误排查与修复步骤

1. 拆分路由,分离页面渲染与数据接口

原路由中/blogs既负责返回页面又要处理数据请求,需拆分出独立的API路由:

// 页面路由:返回视图
Route::get('/blogs', [BlogCategoryController::class, 'index'])->name('categories.index');
// API路由:返回JSON数据
Route::get('/api/blogs', [BlogCategoryController::class, 'getCategories'])->name('categories.api');

// 保留原有其他路由(show/store/update/destroy)
Route::get('/blogs/{category}', [BlogCategoryController::class, 'show'])->name('categories.show');
Route::post('/blogs', [BlogCategoryController::class, 'store'])->name('categories.store');
Route::put('/blogs/{category}', [BlogCategoryController::class, 'update'])->name('categories.update');
Route::delete('/blogs/{category}', [BlogCategoryController::class, 'destroy'])->name('categories.destroy');

2. 修正控制器类名拼写错误

原控制器类名BlgoCategoryController存在拼写错误(少了一个o),需统一修正为BlogCategoryController,确保路由与控制器对应。

3. 添加API数据接口方法

在BlogCategoryController中新增getCategories方法,返回JSON格式的分页数据:

public function getCategories(Request $request) {
    $perPage = $request->perPage ?? 5;
    $keyword = $request->keyword;

    $query = BlogCategory::query();

    if ($keyword) {
        $query->where('category_name', 'like', '%' . $keyword . '%');
    }

    $categories = $query->orderByDesc('id')->paginate($perPage)->withQueryString();

    // 返回JSON格式的分页数据
    return response()->json($categories);
}

// 原index方法保留,负责返回视图
public function index(Request $request) {
    return view('admin.blogs.categories');
}

4. 修复前端JavaScript的API请求地址

将Axios请求的URL从/blogs改为/api/blogs:

const response = await axios.get(
    `/api/blogs?page=${currentPage}&perPage=${perPage}&keyword=${keyword}`
)

5. 修正Loader函数定义问题

原代码中showLoader和hideLoader函数定义在try/finally块内部无法执行,需直接调用DOM操作逻辑:

async function getList() {
    const perPage = document.getElementById("perPage").value
    const keyword = document.getElementById("keyword").value

    // 显示加载器
    document.getElementById('loader').classList.remove('d-none')
    try {
        const response = await axios.get(
            `/api/blogs?page=${currentPage}&perPage=${perPage}&keyword=${keyword}`
        )
        console.log(response);
        updateTable(response.data)
    } catch (error) {
        console.error('Error fetching category data:', error);
    } finally {
        // 隐藏加载器
        document.getElementById('loader').classList.add('d-none')
    }
}

同理,deleteCategory函数中的Loader逻辑也需做同样修改。

6. 完善分页逻辑,避免无效页码请求

添加总页数判断,防止currentPage超出范围:

let totalPages = 1

function updateTable(data) {
    totalPages = data.last_page // Laravel分页返回的总页数字段
    const tableList = document.getElementById("tableList");

    if (!data.data.length) {
        tableList.innerHTML = '<tr><td colspan="4" class="text-center">No categories found.</td></tr>';
        return;
    }

    const rowsHtml = data.data.map(category => {
        return `<tr>
                    <td>${category.id}</td>
                    <td>${category.category_name}</td>
                    <td>${category.category_slug || '未生成'}</td>
                    <td>
                        <button data-id="${category.id}" class="btn editBtn btn-sm btn-outline-success">Edit</button>
                        <button data-id="${category.id}" class="btn deleteBtn btn-sm btn-outline-danger">Delete</button>
                    </td>
                </tr>`;
    }).join('');

    tableList.innerHTML = rowsHtml;
}

// 修改handleNext函数
function handleNext() {
    if (currentPage < totalPages) {
        currentPage++
        getList()
    }
}

7. 补充缺失的fillUpUpdateForm函数

前端点击编辑按钮时调用的fillUpUpdateForm函数未定义,需补充基础实现:

async function fillUpUpdateForm(id) {
    try {
        const response = await axios.get(`/blogs/${id}`)
        const category = response.data
        // 假设模态框中有id为categoryName的输入框,根据实际页面调整
        document.getElementById('categoryName').value = category.category_name
        // 打开编辑模态框,根据实际模态框ID调整
        $('#editCategoryModal').modal('show')
    } catch (error) {
        console.error('Error fetching category data:', error)
    }
}

8. 确保Category Slug字段自动生成

如果category_slug字段未自动生成,需在BlogCategory模型中添加自动生成逻辑:

use Illuminate\Support\Str;

class BlogCategory extends Model
{
    protected static function boot()
    {
        parent::boot();

        // 创建时生成slug
        static::creating(function ($category) {
            $category->category_slug = Str::slug($category->category_name);
        });

        // 更新时同步slug
        static::updating(function ($category) {
            $category->category_slug = Str::slug($category->category_name);
        });
    }
}

内容的提问来源于stack exchange,提问作者MicroWeb Technology Ltd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:15:54