質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

476閲覧

Uncaught (in promise) SyntaxError: Unexpected end of JSON input at …が解決できない

sanchunaka

総合スコア30

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/03/29 11:15

実現したいこと

VSCodeのGoLiveで実行しています。
現代の JavaScript チュートリアル

javascript

1let user = { 2 name: 'John', 3 surname: 'Smith' 4}; 5 6let response = await fetch('/article/fetch-basics/post/user', { 7 method: 'POST', 8 headers: { 9 'Content-Type': 'application/json;charset=utf-8' 10 }, 11 body: JSON.stringify(user) 12}); 13 14let result = await response.json(); 15alert(result.message);

実行結果:以下のように表示したい
User saved.

発生している問題・分からないこと

本体のコードには(async () => {がついていないのでつけています。

Google Chrome consoleで表示されるエラーです。:
Uncaught (in promise) SyntaxError: Unexpected end of JSON input
at index3-2.html:50:33

エラーメッセージ

error

1Google Chrome console: 2Uncaught (in promise) SyntaxError: Unexpected end of JSON input 3 at fetch2.js:17:31

該当のソースコード

javascript

1<!DOCTYPE html> 2<script> 3"use strict"; 4 5(async () => { 6let user = { 7 name: 'John', 8 surname: 'Smith' 9}; 10 11let response = await fetch('/article/fetch-basics/post/user', { 12 method: 'POST', 13 headers: { 14 'Content-Type': 'application/json;charset=utf-8' 15 }, 16 body: JSON.stringify(user) 17}); 18 19let result = await response.json(); 20alert(result.message); 21})() 22</script>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

javascript

1(async () => { 2 3 let user = { 4 name: 'John', 5 surname: 'Smith' 6 }; 7 8 let response = await fetch('http://127.0.0.1:5500/article/fetch-basics/post/user', { 9 10 method: 'POST', 11 headers: { 12 'Content-Type': 'application/json;charset=utf-8' 13 }, 14 body: JSON.stringify(user) 15 }); 16 17 let result = await response.json(); 18 alert(result.message); 19})()

結果は変わりませんでした:
Uncaught (in promise) SyntaxError: Unexpected end of JSON input
at index3-2.html:50:33

補足

localhostで実行できるようにしたいので

よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanchunaka

2024/03/29 11:27

(async () => { let user = { name: 'John', surname: 'Smith' }; let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: JSON.stringify(user) }); let result = await response.json(); alert(result.message); })() でも試しましたが駄目でした。 fetchのURLの問題のようなのですがよくわかりません。 具体的な修正の解答を希望しています。
yambejp

2024/03/29 12:24

ID取り直して同じ質問してます?なにか意味があるのでしょうか?
sanchunaka

2024/03/29 12:34

久しぶりに投稿しまして、やり方がわからなくて、アカウントを取り直しました。 昔のアカウントに戻して、新しいアカウントを削除したいと思っています。 teratailに問い合わせ中です。 こちらで再度投稿させていただきました。
yambejp

2024/03/29 12:44

まぁどちらかに統一してもらえばよいです。 マルチポストするとそれぞれで別の回答が進行してしまって質問者さん自身が困ることになると思うので・・・
Lhankor_Mhy

2024/03/29 12:48

前の質問の回答にあった通り、/article/fetch-basics/post/user にJSONファイルを置くのがいいでしょう。 ファイルの置き方がわからないとのことですが、JSONファイルはVSCodeで作成編集することができますので、試してみてはどうでしょうか。 ただ試していませんが、パスに拡張子が含まれていないので、正しいMIMEタイプのレスポンスにならないかもしれません。user.jsonなどにして、読み込みのパスもそちらに合わせた方が無難かもしれません。
sanchunaka

2024/03/29 13:21

恥ずかしいのですが、今作成しているfetchフォルダに/article/fetch-basics/post/user のJSONファイルを作成するということでしょうか。 article、fetch-basics、post、はフォルダということですよね? user.jsonでやってみます。 これから夜勤です。休みが4日ほどありますのでこの1週間でfetchの章を何とかしたいので、よろしくお願いいたします。
Lhankor_Mhy

2024/03/29 14:48

『今作成しているfetchフォルダ』というのがちょっとこちらからだとわからないのですが、プロジェクトのルートのに作る必要があります。 index3-2.html が http://127.0.0.1:5500/index3-2.html であるなら、おそらくそれで合っていると思います。
sanchunaka

2024/03/29 16:39

ありがとうございます。 出先なので、朝方からやりたいとおもっています、
sanchunaka

2024/03/29 20:19

以下のコードで試しましたがまだ解決できていません。 1.fetch/article/fetch-basics/user.jsonを作成して、 <script> (async () => { let user = { name: 'John', surname: 'Smith' }; let response = await fetch('/1.fetch/article/fetch-basics/post/user', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: JSON.stringify(user) }); let result = await response.json(); alert(result.message); })() </script> さらに以下でも同じエラーになります <script> (async () => { let user = { name: 'John', surname: 'Smith' }; let response = await fetch('/1.fetch/article/fetch-basics/post/user.json', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: JSON.stringify(user) }); let result = await response.json(); alert(result.message); })() </script>
Lhankor_Mhy

2024/03/30 00:36

前の質問の回答にもあったとおり、Live Server は POSTリクエストを受け付けないので、メソッドを GET に変えて、body を消す必要があります。
Lhankor_Mhy

2024/03/30 02:08

元の質問を閉じるという話だったかと思いますが、あちらでも継続しているようです。 いわゆるマルチポストはteratailでは推奨されていません。 この状態ですと、片方の質問でしか共有されていない状況が起き、すでに解決している問題について回答者が労力を払う、などの問題が起きます。 あちらで継続されるのであれば、この質問に削除申請を出してください。
sanchunaka

2024/03/30 12:38

この質問の削除申請の仕方がわかりません。一応teratailに問い合わせとぃるのですが いつまでたってもteratail初心者ですみません。
sanchunaka

2024/03/30 14:01

削除申請しました。うまくいくかどうかわかりません。
guest

回答2

0

ベストアンサー

HTMLは↓で、

html

1<!DOCTYPE html> 2<script> 3 "use strict"; 4 5 (async () => { 6 let user = { 7 name: 'John', 8 surname: 'Smith' 9 }; 10 11 let response = await fetch('/article/fetch-basics/post/user', { 12 // method: 'POST', 13 headers: { 14 'Content-Type': 'application/json;charset=utf-8' 15 }, 16 // body: JSON.stringify(user) 17 }); 18 19 let result = await response.json(); 20 alert(result.message); 21 })() 22</script>

フォルダ構成は↓で動作しました。

イメージ説明

投稿2024/03/30 00:39

Lhankor_Mhy

総合スコア37409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanchunaka

2024/03/30 12:38

ご教授頂いたhtmlと{}userを使って、vscodeのGoLiveで実行すると、 Google Chromeのconsoleに以下のエラーが出ています。 Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON どうすればいいのでしょうか?
sanchunaka

2024/03/30 18:28

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。 実行コード <!DOCTYPE html><!----> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>POSTリクエスト</title> </head> <body> <script> (async () => { let response = await fetch('user.json', { }) let result = await response.json(); alert(result.message); })(); </script> <!--実行結果:Google Chrome-console ▼ {message: 'User saved.'} message:"User saved. ▶ [[Prototype]]:Object --> </body> </html> //user.json  index3-2.htmlと同じところに置き実行できました。 //ここから元のコードに挑戦してみます。ありがとうございました
guest

0

結論から言えばfetchのpostデータは原則formdataで作成してください

javascriptlet

1const user = { 2 name: 'John', 3 surname: 'Smith' 4}; 5const url="..."; 6conts body=Object.entries(user).reduce((x,y)=>(x.append(y[0],y[1]),x),new FormData()); 7fetch(url, { 8 method: 'POST', 9 body, 10}).then(res=>res.text()).then(console.log);

headerでcontent-type:application/jsonで送った場合、サーバー側は標準入力で処理がされるためpostとして認識されません。試せる環境がphpしかないのでphpを例にするとサーバー側の書き方はこんなふうになります

PHP

1<?PHP 2print_r(json_decode(file_get_contents('php://input')));

あえてサーバー側に特殊な処理をさせるよりは最初からpostデータとしてできる前述のようなjsを書くようにしてください

投稿2024/03/30 15:28

yambejp

総合スコア117615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanchunaka

2024/03/30 16:35

すみません。理解できないので勉強しなおしてからやります
yambejp

2024/03/30 16:56 編集

単純に命題のjsではサーバー側の手厚い処理が必要になるということです。 fetchでpost送信時は以下2点を注意する (1)無用なheaders設定をしない (2)formdata形式でデータを受け渡す ということです。おそらく参考にされている情報が非効率もしくは間違っているようです。 検証のため私の例示した形式でGoLiveにfetchしてみることです
sanchunaka

2024/03/30 18:31

少し理解出来ましたので、今からやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問