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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

13750閲覧

【JS】どうみても存在するプロパティがundefinedになる

Fujimon_fn

総合スコア10

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2016/12/09 11:38

編集2016/12/09 11:45

console.log(userObj);では見えている'email'というプロパティが、次の行のconsole.log(userObj.email);でundefined、console.log(userObj.hasOwnProperty('email'))でfalseになります。

###前提・実現したいこと
ログイン後、セッションを確立したユーザーのメールアドレスを動的に表示しようとしています。
認証はAWS Cognitoを使っていて、getUserAttributesで取得したメールアドレスをuserObjというオブジェクトにemailというキーで格納しています。その後userObjを戻り値としたresolve(userObj)の中で、$('#email').html(userObj.email);でメールアドレスを表示しようとしています。

###発生している問題・エラーメッセージ

メールアドレスが表示されなかったので、console.log(userObj)で中身を確認したところ、'email: hogehoge@example.com'はきちんと見えました。ですが直後に実行したconsole.log(userObj.email)はundefinedになり、console.log(userObj.hasOwnProperty('email'))はfalseになりました。

問題の箇所

console.log(userObj); console.log('userObj.email → ' + userObj.email); console.log('userObj.hasOwnProperty("email") → ' + userObj.hasOwnProperty("email"));

上記部分のコンソールの出力結果です↓
イメージ説明

このように、Objectの中身には「email: "hogehoge@example.com"」というのがは見えていますが、直後にはそれがundefinedになり、プロパティ自体存在しないと言われてしまいます。

###該当のソースコード

javascript

1 validateSession(cognitoUser).then(function(userObj){ 2 console.log(userObj); 3 console.log('userObj.email → ' + userObj.email); 4 console.log('userObj.hasOwnProperty("email") → ' + userObj.hasOwnProperty("email")); 5 $('#username').html(userObj.username); 6 $('#email').html(userObj.email); 7 },invaildSession); 8 9var validateSession = function(cognitoUser){ 10 return new Promise(function(resolve, reject){ 11 var userObj = {}; 12 if(cognitoUser != null){ 13 $.each(cognitoUser, function(key, val){ 14 userObj[key] = val; 15 }); 16 cognitoUser.getSession(function(err, sessresult){ 17 if(sessresult){ 18 console.log('Session has been validated.'); 19 // Get user's attributes (ex: email) 20 cognitoUser.getUserAttributes(function(err, attrresult){ 21 if(err){ 22 console.log(err); 23 return; 24 } 25 //attrresultの中身をuserObjに格納 26 $.each(attrresult, function(index, val){ 27 userObj[val['Name']] = val['Value']; 28 }); 29 }); 30 resolve(userObj); 31 }else{ 32 console.log('No sessresult'); 33 reject(); 34 } 35 }); 36 }else{ 37 console.log('No cognito User'); 38 reject(); 39 } 40 }); 41};

###補足情報
Google Chrome 54.0.2840.98 (64-bit)
コンテンツはAmazon S3に置いてます。

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

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

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

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

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

guest

回答1

0

自己解決

resolve(userObj);の位置を、一つ内側にしたら解決しました。

修正後

var validateSession = function(cognitoUser){ return new Promise(function(resolve, reject){ var userObj = {}; if(cognitoUser != null){ $.each(cognitoUser, function(key, val){ userObj[key] = val; }); cognitoUser.getSession(function(err, sessresult){ if(sessresult){ console.log('Session has been validated.'); // Get user's attributes (ex: email) cognitoUser.getUserAttributes(function(err, attrresult){ if(err){ console.log(err); return; } //attrresultの中身をuserObjに格納 $.each(attrresult, function(index, val){ userObj[val['Name']] = val['Value']; }); resolve(userObj); }); //resolve(userObj); }else{ console.log('No sessresult'); reject(); } }); }else{ console.log('No cognito User'); reject(); } }); };

ということは、emailプロパティがuserObjに格納される前にresolve(userObj)が返されていたということでしょうか。なぜconsole.log(userObj)で表示されていたのかは謎です、、、(単に私の知識不足かもしれません><)

投稿2016/12/09 11:54

Fujimon_fn

総合スコア10

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

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

sii_side

2018/08/20 20:57

> resolve(userObj);の位置を、一つ内側にしたら解決 これはおそらく、cognitoUser.getUserAttributesが非同期処理であるというのが理由でしょう。 > emailプロパティがuserObjに格納される前にresolve(userObj)が返されていた ということです。 > なぜconsole.log(userObj)で表示されていたのかは謎 コンソールを操作して、userObjの中身を表示させた(▶をクリックするなどして当該オブジェクトを開いた)のが、cognitoUser.getUserAttributesの非同期処理が完了し、コールバック関数が実行されたよりも後だったからと推測されます。 通常、非同期処理は状況次第ですがミリ秒単位でしょうから、コンソールの操作のほうが後に来ると思われます。 参考例) const o = { a: 0 } window.setInterval(() => o.a++, 1000) console.log(o)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問