该代码在我的本地开发环境中工作正常,但是当我将其上传到服务器时却给出了405 method not allowed
异常。 this问题和this问题的解决方案对我不起作用。
这是控制器。
public function DeleteMultipleProjects(Request $request){
$json = $request->projectsToDelete;
$to_delete = collect([]);
$projects = json_decode($json);
foreach ($projects as $project) {
$to_delete->push($project->id);
}
Project::destroy($to_delete);
}
这是路由文件中的相应条目。
Route::post('/ajax/dashboard/delete-projects', 'ProjectController@DeleteMultipleProjects');
这是URL的AJAX调用。
$.ajax({
url: '/ajax/dashboard/delete-projects',
method: 'POST',
data: {
projectsToDelete: JSON.stringify(vThis.selectedProjects),
},
complete: function(){
vThis.refreshProjects();
}
});
这是示例测试用例的数据。
[{"id":140,"name":"a","updated_at":"Sun, Oct 21, 2018 4:31 AM","selected":true,"selectHovering":false},{"id":139,"name":"New Project","updated_at":"Sun, Oct 21, 2018 4:31 AM","selected":true,"selectHovering":false}]
如何克服这个错误,为什么这只会在生产中发生?
编辑值得注意的是,我还有其他AJAX调用可以遍及整个应用程序,并且它们工作正常。
答案 0 :(得分:0)
似乎您缺少csrf令牌
将您的ajax发布数据更新为:
$.ajax({
url: '/ajax/dashboard/delete-projects',
method: 'POST',
data: {
projectsToDelete: JSON.stringify(vThis.selectedProjects),
_token: '{{ csrf_token() }}',
},
complete: function(){
vThis.refreshProjects();
}
});
答案 1 :(得分:0)
Laravel中的405错误表示您使用的HTTP方法不存在该路由。
如果您在生产中收到此错误,但在本地未收到此错误,则表明您的路由文件已过时或已被缓存。
使用以下方法清除路由缓存:
php artisan route:clear
验证您的POST路由是否存在:
php artisan route:list --path=ajax/dashboard/delete-projects
如果route:list确认您的POST路由存在,但您仍收到405,则可能导致缓存路由的另一件事是opcache,而没有重新验证时间戳,您可能需要重新启动php进程才能清除。 / p>
答案 2 :(得分:0)
问题出在我发送的数据中。我不确定为什么,但是我的服务器不喜欢整个项目数组,因此我将其更新为仅发送我要删除的id
数组,因此将控制器更新为destroy
请求。如果有人有解释,我很好奇。