调用Laravel API端点时出现数据库不存在错误的问题排查
问题描述
我搭建了两个Laravel项目,分别作为服务端和客户端。调用服务端API端点时,出现SQLSTATE[HY000] [1049] Unknown database 'laravel'错误。服务端数据库配置正确,按道理客户端无需连接数据库就能从服务端拿数据,但把客户端的DB_DATABASE从laravel改成服务端的tiket_bioskop后,问题就解决了。想知道这个异常的原因。
相关配置
服务端.env配置
APP_NAME=TEST_TIKET_BIOSKOP APP_ENV=local APP_KEY=base64:GWdPrhK82EoxL/dYOEEzvOObOc1W+KT6SHcVePxOl+A= APP_DEBUG=true APP_URL=http://tiket-bioskop.test LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=tiket_bioskop DB_USERNAME=root DB_PASSWORD=
客户端.env配置
APP_NAME=CLIENT_TIKET_BIOSKOP APP_ENV=local APP_KEY=base64:w+rIpO76tdH9hnbz15Nzb5a4UWezRFBYIT0ndSn0IJg= APP_DEBUG=true APP_URL= http://tiket-bioskop-client.test LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=
服务端控制器代码
public function dashboard() { return response()->json([ 'message' => 'You On Dashboard', 'status' => true, 'tickets' => TiketBioskop::latest()->get() ],200); }
客户端调用API的控制器代码
public function dashboard() { $response = Http::withHeaders([ 'Authorization' => 'Bearer '. session('token'), ])->get('http://tiket-bioskop.test/api/tickets'); $tiket = json_decode($response , true); return $response; }
服务端路由配置
Route::middleware(['auth:sanctum'])->group(function(){ Route::get('/tickets' , [TiketController::class , 'dashboard']); });
异常原因分析
这个问题的核心是客户端项目在请求流程中触发了自身的数据库连接逻辑,而非请求服务端API时服务端出错:
- 客户端
.env配置了DB_CONNECTION=mysql,但DB_DATABASE=laravel对应的数据库不存在。Laravel项目默认启用的一些组件(比如Session、Cookie中间件),或者自定义的全局中间件/服务提供者,会在请求到达控制器之前自动尝试初始化数据库连接,直接抛出数据库不存在的错误。 - 当你把客户端的
DB_DATABASE改为tiket_bioskop时,客户端能成功连接到这个存在的数据库,之前的连接错误消失,请求才会正常走到调用服务端API的逻辑。
如果不想让客户端连接数据库,可以直接将客户端的DB_CONNECTION改为sqlite(无需创建实体文件,或使用内存型sqlite),或者注释掉数据库相关配置,同时确保Session驱动使用file或array(本地测试场景),避免触发数据库连接逻辑。
内容的提问来源于stack exchange,提问作者nikkiSix
相关产品推荐
相关产品推荐

