AWS DynamoDBをjsでいじるときに非同期処理で詰まった話
初めに
このお話は、単に私がJavaScriptの非同期処理を理解していなかっただけなので、プロの皆さんでしたら余裕で回避できる問題だと思います。
私みたいな初学者で、同じようなことに詰まっている方がこの記事を見て解決していただけたら幸いです。
私がやりたかったこと
DynamoDBのCRUD操作を関数内で行い、実行結果を戻り値として受け取る といったことをしたかったのですが、戻り値に値が入っていない状態で返されてしまいました。
// 問題のあるコードfunctiongetHoge(){lethoge;letparams={TableName:'table',Key:{"id":"01"}};documentClient.put(params,function(err,data){if(err){console.log(err);}else{console.log(data);// {}hoge=data;}});returnhoge;}exports.handler=function(event){lethoge=getHoge();console.log(hoge);// undifind}
PHPのようなノリで書いてしまったため、undifindの原因がわからずに悩みまくってましたが、ようやっと非同期処理のせいだ!って気づいたため、以下のように書き直しました
書き直した
// ちゃんと動くやつasyncfunctiongetUser(){lethoge;letparams={TableName:'table',Key:{"id":"01"}};try{// hogeにデータが入るまで待つhoge=awaitdocumentClient.get(params).promise();}catch(e){console.log(e);}returnhoge;}exports.handler=async(event)=>{lethoge=awaitgetUser();console.log(hoge);// {jsonデータが見れる!}};
はい、解決。
公式ドキュメントを見てみると、、、
DynamoDB DocumentClient get-propaty
varparams={TableName:'Table',Key:{HashKey:'hashkey'}};vardocumentClient=newAWS.DynamoDB.DocumentClient();documentClient.get(params,function(err,data){if(err)console.log(err);elseconsole.log(data);});
コールバックで書かれてるので、JS初心者には自力での解決キツイっす。。。
最後に言いたいこと
非同期むづかしい