1. ホーム
  2. フロントエンド
  3. js

JSONの位置0にある予期しないトークン<がエラー解決になりました。

2022-01-21 23:04:20
<ブロッククオート Unhandled Rejection (SyntaxError): Unexpected token < in JSON at position 0

Fetchや他のAjaxライブラリを使用してHTTPリクエストを送信すると、このエラーメッセージ、または類似のエラーが表示されることがあります。
次に、何が原因で、これらの問題をどのように解決すべきかを説明します。

1. 原因について

これらのエラーは、JSONではない戻り値を持つリクエストをサーバーに送信し、JSONメソッドでパースされたときに発生します。この現象が発生するコードは、次のようなものになる可能性があります。

<ボタン
fetch('/users').then(res => res.json())

実際のリクエストは問題なく、戻り値を取得します。問題の鍵は res.json() .

2. JSON.パース

他の方法を使用する JSON.parse をパースする場合、コードは次のようになります。

<ボタン
JSON.parse(`String that is not Json`);

JSON.parse() とは基本的に同じです。 res.json() は同じなので、同じように発生します。

3. 無効なJSON

JSONは、有効なJSON値(オブジェクト、配列、文字列、数値、または、偶数値)で始まる必要があります。
false/true/null で始まる。 < で始まる戻り値は Unexpected token < これはヒントです。
< この記号は、戻り値がJSONではなくHTMLであることを意味します。
このエラーの根本的な原因は、サーバーがJsonではないHTMLやその他の文字列を返していることです。

なぜこのようなことが起こるのでしょうか?
JSON の位置 1" にある予期しないトークン o、またはその他の変数。
サーバーが返すものによって、エラーヒントの内容が異なるものもあります

異なるシンボルや場所を示唆するかもしれませんが、その理由は同じです。あなたのコードがパースしているすべてのJsonは、実際には有効なJsonではないのです。
以下は、私が見たエラーのヒントです。

  • Unexpected token < in JSON at position 1
    Unexpected token p in JSON at position 0
    Unexpected token d in JSON at position 0
    

4. 解決方法

fetchでは、res.json()の代わりにres.text()を使って、テキスト文字列そのものを取得することが可能です。コードを以下のように変更し、コンソールで問題の原因を確認してください。
まず、最初に戻り値をプリントアウトすることです。fetchを使う場合は res.text() の代わりに res.json() を使って文字列を取得します。コードをこのように変換して、何が間違っているのか、プリントアウトに目を通してみてください。

<ボタン
fetch('/users')
  // .then(res => res.json()) // comment this out for now
  .then(res => res.text()) // convert to plain text
  .then(text => console.log(text)) // then log it out

のようなコードに注意してください。 res.json() res.text() このようなメソッドは非同期式です。ですから、その戻り値を直接プリントアウトすることはできません。そのため、console.logは.thenの括弧の中に入れなければならないのです。

5.サーバーが原因なのでしょうか?

サーバーがJSONの代わりにHTMLを返す理由はいくつかあります。

  • 要求された url は存在せず、サーバーは HTML として 404 ページを返します。 リクエストのコードエラー(/usersではなく/userと書くなど)、またはサーバー側のコードエラーの可能性があります。
  • 新しいルートが追加されると、サーバーを再起動する必要があります。 たとえば、Express でサーバを記述している場合、新しい app.get('/users', ...) を再起動しなかった場合、サーバーは新しいルートアドレスに応答しません。
  • クライアント側のプロキシが設定されていない : Create React App のような Webpack の開発サーバーを使用している場合、バックエンドサーバーを指すプロキシを設定することができます。
  • APIのルートURLは / WebpackやCreate React App経由でプロキシを使用している場合、APIルートがルートレベルでないことを確認してください。 / . これはプロキシサーバーを混乱させ、APIリクエストの戻り値の代わりにHTMLを取得することになります。次のようなプレフィックスを付けるとよいでしょう。 /api/ .

また、devtoolsのネットワーク経由でリクエストの返り値を見ることができます。

404ページになっていませんか?(そのアドレスがないとか、コードの入力ミスの可能性があります)。

index.htmlのページでしょうか?(アドレスがない、またはプロキシ設定エラーの可能性があります)

すべてが問題ないように見える場合(新しいアドレスが追加され、サーバーが再起動されていない)、フロントエンドとバックエンドのサーバーを再起動し、問題が解決するかどうかを確認します。