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

Laravel+JWT环境下Auth::id()返回null导致点赞功能报错排查

解决JWT下Auth::id()返回null导致点赞SQL约束错误的问题

看起来你遇到的核心问题是JWT认证的路由没有被正确保护,导致Auth::id()无法获取当前登录用户的ID,最终触发了user_id不能为空的SQL错误。下面是具体的解决步骤和优化建议:

1. 为点赞/取消点赞路由添加JWT认证中间件

你的/like/{id}和/unlike/{id}路由目前没有经过JWT认证中间件,所以Laravel的Auth facade无法识别当前通过JWT登录的用户。需要把这两个路由放到带有jwt.auth中间件的路由组里,或者单独为它们添加中间件:

// 方式一:放到auth路由组内(推荐,保持认证路由统一)
Route::group(['prefix' => 'auth'], function ($router) {
    Route::post('register', 'AuthController@register');
    Route::post('login', 'AuthController@login');
    Route::post('logout', 'AuthController@logout');
    Route::post('refresh', 'AuthController@refresh');
    Route::post('me', 'AuthController@me');
    
    // 把点赞/取消点赞路由移到这里
    Route::get("/like/{id}", [
        "uses" => "LikeController@like"
    ]);
    Route::get("/unlike/{id}", [
        "uses" => "LikeController@unlike"
    ]);
});

// 方式二:单独添加中间件
Route::get("/like/{id}", [
    "uses" => "LikeController@like",
    "middleware" => "jwt.auth"
]);
Route::get("/unlike/{id}", [
    "uses" => "LikeController@unlike",
    "middleware" => "jwt.auth"
]);

2. 验证前端请求是否正确携带JWT Token

确保你的Vue前端在发送点赞/取消点赞请求时,已经在请求头里带上了JWT Token,格式如下:

// 示例:axios请求配置
axios.get(`/auth/like/${articleId}`, {
    headers: {
        'Authorization': `Bearer ${localStorage.getItem('token')}`
    }
})

如果前端没有正确携带Token,后端的JWT中间件会拒绝请求,或者无法识别用户,导致Auth::id()返回null。

3. 优化LikeController的代码(避免潜在错误)

当前代码存在一些潜在问题,比如文章不存在时会报错,取消点赞时如果找不到对应的Like记录也会触发错误,建议优化:

use Auth;
use App\Article;
use App\Like;
use Illuminate\Http\Response;

public function like($id) {
    // 先检查文章是否存在
    $article = Article::find($id);
    if (!$article) {
        return response()->json(['message' => '文章不存在'], Response::HTTP_NOT_FOUND);
    }
    
    // 避免重复点赞(可选,根据业务需求)
    $existingLike = Like::where('user_id', Auth::id())
                        ->where('article_id', $article->id)
                        ->first();
    if ($existingLike) {
        return response()->json(['message' => '你已经点赞过这篇文章了'], Response::HTTP_BAD_REQUEST);
    }
    
    $like = Like::create([
        "user_id" => Auth::id(),
        "article_id" => $article->id
    ]);
    
    return Like::with('user')->find($like->id); // 直接返回关联用户的like记录,不用二次查询
}

public function unlike($id) {
    $article = Article::find($id);
    if (!$article) {
        return response()->json(['message' => '文章不存在'], Response::HTTP_NOT_FOUND);
    }
    
    $like = Like::where("user_id", Auth::id())
                ->where("article_id", $article->id)
                ->first();
    
    if (!$like) {
        return response()->json(['message' => '你还没有点赞这篇文章'], Response::HTTP_BAD_REQUEST);
    }
    
    $like->delete();
    return response()->json(['message' => '取消点赞成功'], Response::HTTP_OK);
}

4. 验证JWT配置是否正确

确认你的config/auth.php里的guards配置已经设置为jwt:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt', // 这里要确保是jwt
        'provider' => 'users',
    ],
],

并且在AuthController里使用了auth:api guard,比如:

public function me(Request $request) {
    return response()->json(auth('api')->user());
}

完成以上步骤后,Auth::id()应该就能正常获取到当前登录用户的ID了,点赞功能也不会再触发SQL约束错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:09:49