JSONの位置0にある予期しないトークン<がエラー解決になりました。
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のページでしょうか?(アドレスがない、またはプロキシ設定エラーの可能性があります)
すべてが問題ないように見える場合(新しいアドレスが追加され、サーバーが再起動されていない)、フロントエンドとバックエンドのサーバーを再起動し、問題が解決するかどうかを確認します。
関連
-
JSエラーです。Uncaught TypeError: nullのプロパティ'addEventListener'を読み取ることができません。
-
JSON の位置 1 に予期しないトークン o がある エラーの理由
-
nodeJS がエラーを報告する JSON の位置 1 に予期しないトークン o がある
-
JSON の位置 0 にある予期しないトークン u が解決されました。
-
エラー [ERR_HTTP_HEADERS_SENT]: クライアントに送信された後のヘッダを設定できない
-
JSONの位置0にある予期しないトークン エラーが解決されました。
-
エラー btn.addEventListener は関数ではありません。
-
CSS3 transformの回転角度の度数をjsで取得する方法、マトリックス解析
-
js ajax 呼び出し 残りインターフェイス
-
jQuery UI ダイアログプラグインのエラーメッセージ。$(this).dialog is not a function and js introduced duplicate solution($(this).dialogは関数ではありません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
オブジェクトが存在するにもかかわらず、null のプロパティ 'addEventListener' を読み込むことができません。
-
Uncaught TypeError: XXX は解決された関数ではありません。
-
タイマーのエラーを解決する:Uncaught TypeError: that.setAttribute is not function
-
uncaught typeerror cannot read property 'data' of undefined エラーの理由
-
Uncaught TypeErrorに関する質問です。プロパティ'onClick'にnullを設定できない。
-
jquery Datatable パラメータとその使用方法
-
ActiveXObjectが定義されていない
-
Uncaught (in promise)は一般的にpormiseの書き方に問題がある。
-
layui (laydate) を使用すると、Cannot read property 'appendChild' of undefined というエラーが、どこをクリックしても表示されます。
-
分割は機能ではありません