javascript - laravel 无法使用 ajax 服务器状态 419 发布数据
问题描述
我正在用 Laravel 做一个项目。
当我更改以下 select 元素的 selected 选项时,我应该将所选值插入 mysql 数据库,以从服务器检索有关所选 id 的所有数据(例如用户名)。
这是选择元素(adminArea.blade.php):
<select name="employees" onchange="fillEmployeeData(this)" class="form-control col-sm-6" id="employees">
<option value="0"></option>
@foreach ($users as $user)
<option value="{{ $user->id }}">{{ $user->surname . ' ' . $user->name }}</option>
@endforeach
</select>
这是被调用的函数 (adminArea.blade.php)::
function fillEmployeeData(emp_id) {
var emp_selected = emp_id.value;
$.ajax({
type: "POST",
url: "{{ route('adminAreaPostEmployee') }}",
data: 'emp_selected=' + emp_selected,
success: function (data) {
var emp_data = JSON.parse(data);
alert(emp_data);
}
});
};
这些是我的路线(web.php):
Route::get('/adminarea', 'AdminAreaController@index')->name('adminArea');
Route::post('/adminarea/postemployee', 'AdminAreaController@post_employee')->name('adminAreaPostEmployee');
这些是我的控制器方法(adminAreaController.php):
public function post_employee(Request $request)
{
$select = $request->get('emp_selected');
$user = User::where('id', $select);
echo $user;
}
public function index()
{
$operations = Operation::all();
$users = User::all()->sortBy('surname');
$rooms = Room::all();
return view('adminArea', compact('users', 'rooms', 'operations'));
}
但是,当我更改所选值时,什么也没有发生……如果我转到开发人员工具,我会看到以下错误:
加载资源失败:服务器响应状态为 419(未知状态)。Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException 此路由不支持 GET 方法。支持的方法:POST。
我没有看到任何警报。有人可以帮助我吗?
解决方案
的 HTTP 状态代码MethodNotAllowedHttpException
是405
看这里
public function __construct(array $allow, string $message = null, \Throwable $previous = null, ?int $code = 0, array $headers = [])
{
$headers['Allow'] = strtoupper(implode(', ', $allow));
parent::__construct(405, $message, $previous, $headers, $code);
}
TokenMismatchException
HTTP 状态码是419
看这里
protected function prepareException(Exception $e)
{
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
} elseif ($e instanceof AuthorizationException) {
$e = new AccessDeniedHttpException($e->getMessage(), $e);
} elseif ($e instanceof TokenMismatchException) {
// HTTP Status code is send in the header here
$e = new HttpException(419, $e->getMessage(), $e);
} elseif ($e instanceof SuspiciousOperationException) {
$e = new NotFoundHttpException('Bad hostname provided.', $e);
}
return $e;
}
所以这似乎是一个 CSRF 令牌问题
确保您的文档头部有一个元标记,如下所示
<meta name="csrf-token" content="{{ csrf_token() }}">
我认为HTTP方法应该被定义为method
参数而不是type
(虽然type
工作¯\_(ツ)_/¯)
// Send a CSRF token header with every Ajax request
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
function fillEmployeeData(emp_id) {
var emp_selected = emp_id.value;
$.ajax({
method: "POST",
url: "{{ route('adminAreaPostEmployee') }}",
data: 'emp_selected=' + emp_selected,
success: function (data) {
var emp_data = JSON.parse(data);
alert(emp_data);
}
});
};
但是现在你会得到一个错误
Illuminate\Database\Eloquent\Builder 类的对象无法转换为字符串
因为您试图返回一个查询生成器实例User::where('id', $select)
,而不是序列化的用户记录本身
我想你可能想这样做
public function post_employee(Request $request)
{
$select = $request->get('emp_selected');
return User::find($select);
}
希望这可以帮助
推荐阅读
- javascript - 如何使用 Jquery 为选择下拉菜单设置默认值?
- pandas - Pandas hash_pandas_object 校验和值不稳定
- javascript - 错误的建议解决方案: OPERATION_NOT_ALLOWED : 身份提供者配置已禁用
- c# - 为什么要为这个配置类创建一个接口?
- java - 如何防止使用@autowired
- apache - 如何授予对使用 Docker(Dockerfile)创建的 apache 服务器的访问权限
- java - Firebase 如何在 Auth 中定义当前用户?
- spring - CRUDRepository 无法保存修改的实体
- javascript - 如何替换所有严格的字符串模式?
- java - 在 Selenium Java 中一段时间后关闭窗口