优化访问接口报错Server internal error

This commit is contained in:
2026-03-06 10:33:44 +08:00
parent 7e8867ed12
commit 768cf5137c
6 changed files with 96 additions and 68 deletions

View File

@@ -3,6 +3,7 @@ declare(strict_types=1);
namespace app\api\controller; namespace app\api\controller;
use support\Log;
use support\Request; use support\Request;
use support\Response; use support\Response;
use app\api\logic\GameLogic; use app\api\logic\GameLogic;
@@ -110,10 +111,13 @@ class GameController extends OpenController
'roll_array' => '[]', 'roll_array' => '[]',
'status' => PlayStartLogic::RECORD_STATUS_TIMEOUT, 'status' => PlayStartLogic::RECORD_STATUS_TIMEOUT,
]); ]);
} catch (\Throwable $_) { } catch (\Exception $e) {
$timeout_message = $e->getMessage();
Log::error("游玩记录写入超时: ". $e->getMessage());
} }
$payload = $timeoutRecord ? ['record' => $timeoutRecord->toArray()] : []; $payload = $timeoutRecord ? ['record' => $timeoutRecord->toArray()] : [];
return $this->success($payload, '服务超时'); return $this->success($payload, '服务超时'.$timeout_message ?? '没有原因');
} }
} }
} }

View File

@@ -33,24 +33,26 @@ class SystemController extends BaseController
*/ */
public function userInfo(): Response public function userInfo(): Response
{ {
$info['user'] = $this->adminInfo; if ($this->adminInfo === null || !is_array($this->adminInfo) || !isset($this->adminInfo['id'])) {
return $this->fail('登录已过期或用户信息无效,请重新登录', 401);
}
$info = []; $info = [];
$info['id'] = $this->adminInfo['id']; $info['id'] = $this->adminInfo['id'];
$info['username'] = $this->adminInfo['username']; $info['username'] = $this->adminInfo['username'];
$info['dashboard'] = $this->adminInfo['dashboard']; $info['dashboard'] = $this->adminInfo['dashboard'] ?? '';
$info['avatar'] = $this->adminInfo['avatar']; $info['avatar'] = $this->adminInfo['avatar'] ?? '';
$info['email'] = $this->adminInfo['email']; $info['email'] = $this->adminInfo['email'] ?? '';
$info['phone'] = $this->adminInfo['phone']; $info['phone'] = $this->adminInfo['phone'] ?? '';
$info['gender'] = $this->adminInfo['gender']; $info['gender'] = $this->adminInfo['gender'] ?? '';
$info['signed'] = $this->adminInfo['signed']; $info['signed'] = $this->adminInfo['signed'] ?? '';
$info['realname'] = $this->adminInfo['realname']; $info['realname'] = $this->adminInfo['realname'] ?? '';
$info['department'] = $this->adminInfo['deptList']; $info['department'] = $this->adminInfo['deptList'] ?? [];
if ($this->adminInfo['id'] === 1) { if ((int) $this->adminInfo['id'] === 1) {
$info['buttons'] = ['*']; $info['buttons'] = ['*'];
$info['roles'] = ['super_admin']; $info['roles'] = ['super_admin'];
} else { } else {
$info['buttons'] = UserAuthCache::getUserAuth($this->adminInfo['id']); $info['buttons'] = UserAuthCache::getUserAuth($this->adminInfo['id']);
$info['roles'] = Arr::getArrayColumn($this->adminInfo['roleList'], 'code'); $info['roles'] = Arr::getArrayColumn($this->adminInfo['roleList'] ?? [], 'code');
} }
return $this->success($info); return $this->success($info);
} }
@@ -70,6 +72,9 @@ class SystemController extends BaseController
*/ */
public function menu(): Response public function menu(): Response
{ {
if ($this->adminInfo === null || !is_array($this->adminInfo) || !isset($this->adminInfo['id'])) {
return $this->fail('登录已过期或用户信息无效,请重新登录', 401);
}
$data = UserMenuCache::getUserMenu($this->adminInfo['id']); $data = UserMenuCache::getUserMenu($this->adminInfo['id']);
return $this->success($data); return $this->success($data);
} }

View File

@@ -40,29 +40,35 @@ class Handler extends ExceptionHandler
$this->logger->error($logs); $this->logger->error($logs);
} }
public function render(Request $request, Throwable $exception): Response // public function render(Request $request, Throwable $exception): Response
{ // {
$debug = config('app.debug', true); // $debug = config('app.debug', true);
$code = $exception->getCode(); // $code = $exception->getCode();
$json = [ // $httpCode = ($code >= 400 && $code < 600) ? $code : 500;
'code' => $code ? $code : 500, // // 开启 debug 时始终返回真实错误信息,便于排查;未开启时 500 不暴露详情
'message' => $code !== 500 ? $exception->getMessage() : 'Server internal error', // $message = $exception->getMessage();
'type' => 'failed' // if (!$debug && $httpCode === 500) {
]; // $message = 'Server internal error';
if ($debug) { // }
$json['request_url'] = $request->method() . ' ' . $request->uri(); // $json = [
$json['timestamp'] = date('Y-m-d H:i:s'); // 'code' => $httpCode,
$json['client_ip'] = $request->getRealIp(); // 'message' => $message,
$json['request_param'] = $request->all(); // 'type' => 'failed'
$json['exception_handle'] = get_class($exception); // ];
$json['exception_info'] = [ // if ($debug) {
'code' => $exception->getCode(), // $json['request_url'] = $request->method() . ' ' . $request->uri();
'message' => $exception->getMessage(), // $json['timestamp'] = date('Y-m-d H:i:s');
'file' => $exception->getFile(), // $json['client_ip'] = $request->getRealIp();
'line' => $exception->getLine(), // $json['request_param'] = $request->all();
'trace' => explode("\n", $exception->getTraceAsString()) // $json['exception_handle'] = get_class($exception);
]; // $json['exception_info'] = [
} // 'code' => $exception->getCode(),
return new Response(200, ['Content-Type' => 'application/json;charset=utf-8'], json_encode($json)); // 'message' => $exception->getMessage(),
} // 'file' => $exception->getFile(),
// 'line' => $exception->getLine(),
// 'trace' => explode("\n", $exception->getTraceAsString())
// ];
// }
// return new Response(200, ['Content-Type' => 'application/json;charset=utf-8'], json_encode($json));
// }
} }

View File

@@ -32,8 +32,11 @@ class CheckLogin implements MiddlewareInterface
if ($token['plat'] !== 'saiadmin') { if ($token['plat'] !== 'saiadmin') {
throw new ApiException('登录凭证校验失败'); throw new ApiException('登录凭证校验失败');
} }
$request->setHeader('check_login', true); // 一次合并设置,避免 setHeader 覆盖导致只保留最后一个
$request->setHeader('check_admin', $token); $request->setHeader(array_merge($request->header() ?: [], [
'check_login' => true,
'check_admin' => $token,
]));
} }
return $handler($request); return $handler($request);
} }

View File

@@ -45,16 +45,20 @@ class BaseController extends OpenController
*/ */
protected function init(): void protected function init(): void
{ {
// 登录模式赋值 // 登录模式赋值(仅当 check_admin 有效时赋值,避免登录接口等未带 token 时访问 null 导致报错)
$isLogin = request()->header('check_login', false); $isLogin = request()->header('check_login', false);
if ($isLogin) { $result = request()->header('check_admin');
$result = request()->header('check_admin'); if ($isLogin && $result !== null && (is_array($result) || is_object($result))) {
$this->adminId = $result['id']; $arr = is_array($result) ? $result : (array) $result;
$this->adminName = $result['username']; $adminId = $arr['id'] ?? null;
$this->adminInfo = UserInfoCache::getUserInfo($result['id']); if ($adminId !== null) {
$this->adminId = (int) $adminId;
$this->adminName = $arr['username'] ?? '';
$this->adminInfo = UserInfoCache::getUserInfo($adminId);
// 用户数据传递给逻辑层 // 用户数据传递给逻辑层
$this->logic && $this->logic->init($this->adminInfo); $this->logic && $this->logic->init($this->adminInfo);
}
} }
} }

View File

@@ -106,18 +106,21 @@ class BaseModel extends Model implements ModelInterface
*/ */
public static function onBeforeInsert($model): void public static function onBeforeInsert($model): void
{ {
$createTime = $model->createTime ?? 'create_time'; try {
if ($createTime && !$model->getData($createTime)) { $createTime = $model->createTime ?? 'create_time';
$model->set($createTime, date('Y-m-d H:i:s')); if ($createTime && !$model->getData($createTime)) {
$model->set($createTime, date('Y-m-d H:i:s'));
}
} catch (\Throwable $e) {
} }
if (function_exists('getCurrentInfo')) { try {
$info = getCurrentInfo(); if (function_exists('getCurrentInfo')) {
if (!empty($info['id'])) { $info = getCurrentInfo();
try { if (!empty($info['id'])) {
$model->setAttr('created_by', $info['id']); $model->setAttr('created_by', $info['id']);
} catch (\Throwable $e) {
} }
} }
} catch (\Throwable $e) {
} }
} }
@@ -128,20 +131,23 @@ class BaseModel extends Model implements ModelInterface
*/ */
public static function onBeforeWrite($model): void public static function onBeforeWrite($model): void
{ {
if ($model->isExists()) { try {
$updateTime = $model->updateTime ?? 'update_time'; if ($model->isExists()) {
if ($updateTime) { $updateTime = $model->updateTime ?? 'update_time';
$model->set($updateTime, date('Y-m-d H:i:s')); if ($updateTime) {
} $model->set($updateTime, date('Y-m-d H:i:s'));
}
if (function_exists('getCurrentInfo')) {
$info = getCurrentInfo();
if (!empty($info['id'])) {
try {
$model->setAttr('updated_by', $info['id']);
} catch (\Throwable $e) {
} }
} }
} catch (\Throwable $e) {
}
try {
if (function_exists('getCurrentInfo')) {
$info = getCurrentInfo();
if (!empty($info['id'])) {
$model->setAttr('updated_by', $info['id']);
}
}
} catch (\Throwable $e) {
} }
} }
} }