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

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

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

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

159閲覧

Javascript TypeError : cannot read properties of undefined (reading 'fields')の解決方法が分からない

kuuuuuya

総合スコア29

JavaScript

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2024/04/13 09:46

実現したいこと

CloudfrontからAPIgateway・Lambda経由でS3にファイルをアップロードするwebアプリケーションを実現したいです。

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

下記の公式サイトを参考に、APIgatewayのデフォルトエンドポイントからファイルアップロードをすることはできました。
https://aws.amazon.com/jp/blogs/news/large-size-files-transferring-by-serverless-s3presignedurl-and-clientside-javascript/

ただ、cloudfrontのオリジンにAPIgatewayのデフォルトエンドポイントを設定し、ファイルアップロードを試みたところ、タイトルにあるエラーが発生しました。
調べたところ、javascriptの型未定義エラーの可能性が高いです。
エラーが発生している可能性のあるソースコードは下記になります。

エラーメッセージ

error

1TypeError : cannot read properties of undefined (reading 'fields')

該当のソースコード

Javascript

1 const fields = targetInfo["contents"]["fields"]; 2 Object.keys(fields).forEach(key => formData.append(key, fields[key])); 3

試したこと・調べたこと

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

・cloudfrontではなく、APIgatewayのカスタムドメインを設定したところ同様のエラーが出ました。

補足

特になし

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

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

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

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

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

yu_1985

2024/04/13 10:09

型ではなくてcontentsにfieldsというプロパティが定義されてないというメッセージではないでしょうか。 なのてcontentsがちゃんと取得できているかのあたりをデバッグしてみてください そもそもこのケースだとAPI Gatewayの前にCloudFrontを置く必要があまりなさそうに思えるのですが、なぜそうしたいのでしょう?
kuuuuuya

2024/04/13 10:24

ご回答いただきありがとうございます。 早急にデバックをいたします。 Cloudfrontを置く理由はACM証明書を設定したいためですが、Cloudfrontを置く必要はないですか?
kuuuuuya

2024/04/13 14:37

リンクまで添付していただき、ありがとうございます。 早速試してみました、カスタムドメイン経由でもやはり下記の同じエラーが出てしまいます。 TypeError: Cannot read properties of undefined (reading 'fields') at HTMLFormElement.<anonymous> ただ、カスタムドメイン経由では下記のエラーも出ております。 GET 403 (Forbidden) 一つ目 : fetchwrapper const fetchWrapper = async (uri, params) => { let data; let response; try { response = await fetch(uri, params); data = await response.json(); } catch (error) { throw new Error(`Fetch Call response failed] status: ${response.status}`); } return data; } 二つ目 : getTransferTargetInfo export const getTransferTargetInfo = async (resourcePath) => { let idToken = sessionStorage.getItem("id_token"); // トークンがセッション情報から取得できなかった場合は処理終了 if (idToken === null) { throw new Error("[Token Error] Failed to get token."); } /** アップロード/ダウンロードのための関連情報 */ let targetInfo; try{ let apiStage = EXECUTE_API_STAGE; // API 呼び出し実行 targetInfo = await fetchWrapper(`${location.origin}${apiStage}${resourcePath}`, { method: "GET", headers: { "Authorization": `Bearer ${sessionStorage.getItem("id_token")})}` } }); } catch (error) { console.error(`[API Errors] ${error}`); } return targetInfo; } 3つ目:(anonymous) let targetInfo = await getTransferTargetInfo("/api/upload");
yu_1985

2024/04/13 15:34

細かいデバッグの話になるので、まずはエラーが発生するときのcontentsの中に何が入っているのかを調べて、そこから原因を絞り込んでいってください。
guest

回答1

0

ベストアンサー

これはエラーメッセージのとおりです。
エラーメッセージを雑に翻訳すると、「undefined のプロパティは読めません ('field' を読もうとしています)」となります。
コードを見ると、targetInfo["contents"]["fields"] という箇所があり、targetInfo["contents"] が undefined であるにも関わらず、["field"] プロパティにアクセスしようとしているため、上記のエラーが出たものと思われます。
先に targetInfo の contents フィールドに値を設定するようにすればエラーは解消します。

ちなみに、JavaScript に型を定義する機能はありませんし、必要もないので、JavaScriptの型未定義エラーというのはあり得ません。

投稿2024/04/13 10:07

R.Mizukami

総合スコア1086

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

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

kuuuuuya

2024/04/13 15:04

ご回答いただき、ありがとうございます。 エラー内容をちゃんと理解できていないのに、質問してしまい申し訳ございませんでした。 ご教示いただき、ありがとうございます。 先に targetInfo の contents フィールドに値を設定するとご教示いただいたのですが、デフォルトエンドポイントからは問題なくアップロードできるため、どこに値を設定すればよいか分からない状況です。 ただ、デフォルトエンドポイントでは出なかった下記のエラーが出ているため、こちらが原因なのかなと思っております。 GET 403 (Forbidden) 一つ目 : fetchwrapper const fetchWrapper = async (uri, params) => { let data; let response; try { response = await fetch(uri, params); data = await response.json(); } catch (error) { throw new Error(`Fetch Call response failed] status: ${response.status}`); } return data; } 二つ目 : getTransferTargetInfo export const getTransferTargetInfo = async (resourcePath) => { let idToken = sessionStorage.getItem("id_token"); // トークンがセッション情報から取得できなかった場合は処理終了 if (idToken === null) { throw new Error("[Token Error] Failed to get token."); } /** アップロード/ダウンロードのための関連情報 */ let targetInfo; try{ let apiStage = EXECUTE_API_STAGE; // API 呼び出し実行 targetInfo = await fetchWrapper(`${location.origin}${apiStage}${resourcePath}`, { method: "GET", headers: { "Authorization": `Bearer ${sessionStorage.getItem("id_token")})}` } }); } catch (error) { console.error(`[API Errors] ${error}`); } return targetInfo; } 3つ目:(anonymous) let targetInfo = await getTransferTargetInfo("/api/upload"); 同時にGET <URL> 403(forbidden)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問