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
相关产品推荐
相关产品推荐

