taka224
@taka224 (加藤 高明)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

AstroとWordpressとの接続

解決したいこと

Unexpected token '<', "<!DOCTYPE "... is not valid JSON
このエラーの原因がわからない

---
const res = await fetch(`${import.meta.env.PUBLIC_API_URL}posts`);
const posts = await res.json();
---

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>ブログ一覧</title>
</head>
<body>
	<dl>
		{posts.map((post)=>
		<dt>{posts.date}</dt>
		<dd>{posts.title.rendered}</dd>
		)}
	</dl>
</body>
</html>

エラー画面
cap.PNG

0

2Answer

JSON 形式の応答を期待していたが、返された応答は '<', "<!DOCTYPE "... となっていて JSON としては正しくないということです。それ以上のことは質問内容があまりに情報不足で分かりません。

1Like

Comments

  1. @taka224

    Questioner

    投稿を修正していたので中途半端になってしまいました。

  2. たぶん、const posts = await res.json(); のところでそのエラーが出ているのだろうと想像してますが、そうだとすると、その前の fetch に指定される url は JSON 文字列を返さないからです ("<!DOCTYPE " と言うところから多分そのページの html ソースが返されているのでしょう)。

    それ以上のことはやはり情報不足で分かりません。

  3. @taka224

    Questioner

    ありがとうございます。
    これ以上情報ありません。
    どうすれば良いですか?

  4. 質問のコードが何をしているのか分かりますか? どこかからコピペしてきただけで何も分からないということであれば、勉強して少なくとも何をしているのかを理解しないと話が通じません・・・が、一応、調べるべきことを書いておくと、

    fetch の要求先からは、コードを見る限り JSON 文字列が返ってくることを期待しているようですが、エラーメッセージからはそうなってません。それは何故かをまず調べてください。そこは他人に聞いても分かりません。自分で調べないとダメです。

  5. 加藤さん、ちょうど気づきましたが、この問題は fetch が HTMLフラグメントを返しており、有効なJSON形式ではないため、res.json() の行でエラーが発生します。fetchのURLが {date: 'date', title: "title"} のような形式を返すようにしてみてください。

  6. @vipic さん

    そのことはすでに自分が指摘しています。

  7. 申し訳ございません、コメントが折りたたまれることに気づきました。お返事を拝見しました、ありがとうございました。

await fetch の部分のコードの前後にtry catchを追加してみてください。次の行のawait res.json()try catchで囲むことができます。このようにすると、どの行で問題が発生しているかがわかるかもしれません。

1Like

Comments

  1. 下手に try - catch を使うと、問題を握りつぶして無かったことにして、ますます訳が分からなくなることがあると思います。ブラウザの開発者ツールを使えばどこで例外が出たかは分かるはずです。

  2. astro拡張子のファイルはサーバーで実行されたコンテンツを生成してページに出力します。ブラウザのコンソールではログを表示できません(しかし、コマンドラインでは表示可能です)。

    try catch を追加することで、fetch 行のコードに問題があるのか、res.json() 行に問題があるのかを特定するためであり、問題を避けるためではありません。

    あなたの注意に感謝し、加藤さんが本当に try catch をずっと置いておられることを心配しています。

  3. @taka224

    Questioner

    皆さんありがとうございます。
    ただtry catchしてもわからないです。

  4. @vipic さんの提案 try - catch は、どこでどういうエラーが出るかを調べるためのもののようですが、であれば、それはすでに分かっているので意味がありません。

    繰り返しますが、fetch の要求先からは、コードを見る限り JSON 文字列が返ってくることを期待しているようですが、エラーメッセージからはそうなってません。それは何故かをまず調べてください。そこは他人に聞いても分かりません。自分で調べないとダメです。

  5. @taka224

    Questioner

    調べる方法がわからないので教えてください。

  6. @taka224

    Questioner

    原因が分かったかもしれません。
    WordPressのJSONのURLがサブドメインだとダメらしいです。
    そんなことありますか?

  7. サブドメインであろうと何であろうと、期待する JSON 文字列を返してくれれば問題ないです。

    単純に、fetch の引数に指定した ${import.meta.env.PUBLIC_API_URL}posts で取得される url が間違っているということではないのでしょうか?

  8. @taka224

    Questioner

    ${import.meta.env.PUBLIC_API_URL}postsを直接URLに変えてもエラーになってしまいます。

  9. ${import.meta.env.PUBLIC_API_URL}postsを直接URLに変えてもエラーになってしまいます。

    サーバー側が動いている状態で、新たにブラウザを立ち上げて、そのアドレスバーに「直接URL」(http から始まるフルパスにしてください) を打ち込んで要求をかけたらどうなりますか? エラーメッセージからすると、ブラウザには JSON 文字列ではなく、html ページが表示されるのではなかろうかと思います。

  10. @taka224

    Questioner

    ごめんなさい
    直接URLを叩いたらjsonが表示されました!
    なのでエラーの原因がますますわからなくなりました。
    Urlによってはエラーが出ずに問題なく表示するページもあります。

  11. Fiddler やブラウザの開発者ツールで要求・応答をキャプチャして、エラーとなるときと期待通りになるときの結果を比較すると何か解決のためのヒントが得られるかもしれません。

  12. @taka224

    Questioner

    やはりURLの違いしかエラーの原因だと思えないです。
    他のコードはいじってないので
    cap.PNG

  13. 500 Internal Server Error となってますが、ということは、URL の違いとかではなくて、サーバーで要求を処理するときに問題が発生してまともに処理ができてないということです。話が違ってきてませんか?

  14. @taka224

    Questioner

    すみません。
    ブラウザで直接URLを叩くと表示されるのに、500 Internal Server Errorになる意味がわかりません。

  15. それはもう私には分かりません。エスパーでもない限りここに書いてあること以外は知りえない第三者には分からないのではないかと思います。お役に立てずスミマセン

  16. @taka224

    Astroフレームワークの一部はサーバー側で実行され、ブラウザに渡って実行されるわけではありません。したがって、サーバーで問題が発生すると一般的なエラーが500エラーです。

    これまで長い間見てきたので、最初はこれを置いておくことをお勧めします。あなたの理解した内容から始め、理解した内容が増えたら再びこれを見てください。

  17. @taka224

    Questioner

    前にも書きましたが、他のコードは何もいじっておらず、URLによってはエラーが出ずに問題なく表示するページもあります。しかも、エラーになったときも直接URLにアクセスするとちゃんとJSONが表示されます。
    これをどう考えたら良いのでしょうか?

Your answer might help someone💌