Делаю систему лайков и дислайков. При очень частом нажатии на ссылку (over 99 в сек), у меня это иконка пальца (большого), в ответе от сервера вот это: Код (Text): { "message": "Server Error" }{ "message": "Server Error" } Как это можно исправить? Сервер тонет от запросов, не соблюдается очередь запросов, или что? // post.blade.php HTML: <a class="likes" href="#" onclick="likeAction(event)" data-set="/like/add" data-unset="/like/delete" data-pid="{{ $post->id }}"> <i class="fa fa-thumbs-up {{ $post->liked ? 'green' : '' }}" aria-hidden="true"></i> <span class="{{ $post->liked ? 'green' : '' }}">{{ $post->likes ?: '' }}</span> </a> // main.js Код (Javascript): function likeAction(e) { e.preventDefault(); let elem = $(e.target); if (!elem.hasClass('likes')) { elem = elem.parents('.likes'); } let likeExists = elem.children('i').hasClass('green'); elem.children().toggleClass('green'); likeExists ? unsetLike(elem) : setLike(elem); } function setLike(elem) { let url = elem.attr('data-set'); let id = elem.attr('data-pid'); let req = sendRequest({post_id: id}, url); req.then( response => { if (+response === 0) { elem.children('span').html(''); } else { elem.children('span').html(response); } } ); } function unsetLike(elem) { let url = elem.attr('data-unset'); let id = elem.attr('data-pid'); let req = sendRequest({post_id: id}, url); req.then( response => { if (+response === 0) { elem.children('span').html(''); } else { elem.children('span').html(response); } } ); } // LikeController.php PHP: public function __construct(Like $like,Dislike $dislike,Post $post) { $this->like = $like; $this->dislike = $dislike; $this->post = $post; } /** * @param ValidateService $validateSvc * @return string */ public function add(ValidateService $validateSvc) { $userId = request()->user()->id; $postId = request()->input('post_id'); // check if string from client contain only digits (one or more) if(!$validateSvc->validatePostId($postId)) return 'Non-numeric postId'; $dislikeExists = $this->checkIfDislikeExists($userId,$postId); $postRec = $this->post->getPostById($postId); // if dislike exists we need to delete it if($dislikeExists) { if ($this->dislike->deleteByUserIdAndPostId($userId,$postId)) $this->decrementDislikesNum($postRec); } // add like if ($this->like->createByUserIdAndPostId($userId,$postId)) $likesNum = $this->incrementLikesNum($postRec); return $likesNum; } public function delete(ValidateService $validateSvc) { $userId = request()->user()->id; $postId = request()->input('post_id'); if(!$validateSvc->validatePostId($postId)) return 'Non-numeric postId'; $postRec = $this->post->getPostById($postId); if ($this->like->deleteByUserIdAndPostId($userId,$postId)) $likesNum = $this->decrementLikesNum($postRec); return $likesNum; }
В логах такая ошибка: (через каждые примерно 12 запросов) Код (Text): [2018-03-05 14:17:27] production.ERROR: No application encryption key has been specified. {"exception":"[object] (RuntimeException(code: 0): No application encryption key has been specified. at E:\\openserver\\OpenServer\\domains\\d-list.ru_dev\\vendor\\laravel\\framework\\src\\Illuminate\\Encryption\\EncryptionServiceProvider.php:42) [stacktrace] Перегенерировать ключ пробовал (php artisan key:generate), проблему не решило. [UPDATE] Проблему частично решил командой (php artisan config:cache). Теперь даже при очень частом клике ошибки сервера нет, но накручиваются лайки через упорное кликание
хм... а что вы хотите от openserver под виндой? Оно предназначено для разработки и не обязано держать нагрузки )
Написал такой "костыль". Думаю на юзабилити это не отразится негативно. По крайней мере работает корректно и не отправляется много запросов) Код (Javascript): function likeAction(e) { if (typeof likeTimer === 'undefined') { likeTimer = 0; } e.preventDefault(); let elem = $(e.target); if (!elem.hasClass('likes')) { elem = elem.parents('.likes'); } clearTimeout(likeTimer); likeTimer = setTimeout(function () { let likeExists = elem.children('i').hasClass('green'); elem.children().toggleClass('green'); likeExists ? unsetLike(elem) : setLike(elem); },500); }