fetchを使って非同期通信での画面表示およびデータベースの更新をしたいのですが、エラーが出てしまっており、解消できずにおります。
like.js
javascript
1'use strict'; 2 3const likeBtns = document.querySelectorAll('.like'); 4let likeCount = 0 5 6likeBtns.forEach(likeBtn => { 7 const likeNum = likeBtn.parentNode.lastChild; 8 9 likeNum.textContent = likeCount; 10 11 12 likeBtn.addEventListener('click', ()=>{ 13 likeCount++; 14 15 //更新後のlike数をappendしています 16 const formData = new FormData(); 17 formData.append('like', likeCount); 18 19 //postのidをappendしています 20 const postId = likeBtn.parentNode.parentNode.parentNode.dataset.postId; 21 formData.append('id', postId); 22 23 const token = document.getElementsByName('csrf-token').item(0).content; 24 25 fetch('/like', { 26 method:'POST', 27 headers:{ 28 'X-CSRF-TOKEN': token 29 }, 30 body:formData 31 }) 32 .then(function(response) { 33 console.log(response); //こちらではresuponseが返ってきているようです 34 return response.json(); //こちらがエラーが示す32行目です 35 }) 36 .then(function(json) { 37 console.log(json); //(エラーで止まってしまっているから?)こちらは表示されません 38 }); 39 }); 40});
上記のJavascriptではlikeボタンがクリックされたら更新情報を/like
(PostController.phpのlikeメソッドに行き着きます)に向けて送信してデータベースを更新したいのですが、likeボタンをクリックすると、chromeのコンソールに以下のエラーが表示されてしまいます。
Uncaught (in promise) SyntaxError: Unexpected end of JSON input at like.js:32
どうやらreturn response.json();
がエラーとなってしまっているようなのですが、調べても原因にいきつけませんでした。
ちなみにconsole.log(response);
では以下の通り、responseが返ってきているようです。
Response {type: "basic", url: "http://localhost/like", redirected: false, status: 200, ok: true, …} body: (...) bodyUsed: true headers: Headers {} ok: true redirected: false status: 200 statusText: "OK" type: "basic" url: "http://localhost/like" __proto__: Response
こちらが、chromeのデベロッパーツール(networkタブ)での該当通信です。
そして、以下がデータの送信先のPostController.phpです。
PostController.php
php
1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Illuminate\Support\Facades\Auth; 7use App\Post; 8 9class PostController extends Controller 10{ 11 public function like(Request $request) 12 { 13 $post = Post::find($request->id); 14 $post->like = $request->like; 15 16 $post->save(); 17 } 18}
まだfetchについて理解ができていない部分が多々あるため、ご回答いただいた内容の理解に時間が掛かってしまうかもしれませんが、どうかアドバイスをお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/15 01:20
2020/07/15 09:11
2020/07/16 01:43