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

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

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

2051閲覧

LamndaでAsyncを使っても実行結果がレスポンスできない

退会済みユーザー

退会済みユーザー

総合スコア0

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2019/01/20 12:33

前提・実現したいこと

DynamoDBを使ったDBの更新処理をAsyncを使用しLambdaで実行しようとしているのですが
結果を正常にレスポンスすることができない(dynamo.updateの動作に入ってからすぐに
タイムアウトとなってしまっているような状態です)
どのようにしたら、この状態を回避できるでしょうか…?

###ソースコード

Nodejs(8.0x)

1const AWS = require("aws-sdk"); 2const DynamoDB = new AWS.DynamoDB.DocumentClient({ 3 region: "ap-northeast-1" 4}); 5 6exports.handler = async (event) => { 7try{ 8 //食材情報を取得する 9 console.log('fired') 10 let param2 = { 11 TableName: "syokuzai_stock", 12 Key:{ 13 "syokuzai": event.body.itemid, 14 "userid": event.body.userid 15 }, 16 UpdateExpression: 'SET syokuzai_log = list_append(syokuzai_log, :list1_add_data)', 17 ExpressionAttributeValues: {':list1_add_data': [{'amount':event.body.num, 'price': event.body.price, 'shop': "no record", 'unit': event.body.unit }]}, 18 ReturnValues:"UPDATED_NEW" 19 } 20 //console.log(param2); 21 const syokuzaiInfo2 = await DynamoDB.update(param2) 22 .then(function(result){ 23 console.log(result); 24 }, function(err){ 25 console.log(err); 26 }).promise(); 27 return syokuzaiInfo2 28 29 } catch (err){ 30 }

Lambdaログ

Function Logs: START RequestId: b44aeb7c-a12a-4b0c-8f0d-3f98b4301b1b Version: $LATEST 2019-01-20T12:13:02.567Z b44aeb7c-a12a-4b0c-8f0d-3f98b4301b1b fired END RequestId: b44aeb7c-a12a-4b0c-8f0d-3f98b4301b1b REPORT RequestId: b44aeb7c-a12a-4b0c-8f0d-3f98b4301b1b Duration: 59.52 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 28 MB

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

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

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

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

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

guest

回答1

0

ベストアンサー

JavaScript

1 const syokuzaiInfo2 = await DynamoDB.update(param2) 2 .then(function(result){ 3 console.log(result); 4 }, function(err){ 5 console.log(err); 6 }).promise();

ここの部分でPromiseとasync/awaitの理解が不十分だとわかるので、お勉強再開です。
awaitは右辺がPromiseならば状態が保留から完了になるまで一生待ち、thenを叩いて中の値を取り出す仕組みになっています。

しかし、今回はDynamoDB.update(param2)はPromiseを返すものの、
.then(result => {console.log(result)})という関数が間に挟まっており、何の値もreturnしていません。
Promiseなり値なりを返せばthenが終わって状態が保留から完了になるのに、何も返さないから一生保留のままのPromiseになってしまっています。

正解はこう。

JavaScript

1const syokuzaiInfo2 = await DynamoDB.update(param2);

このためのtry-catchなので、そこで受けるようにすれば十分です。
関数の中身をまともに整形しつつ問題の箇所を修正したのが下記のコードになります。

JavaScript

1exports.handler = async (event) => { 2 try{ 3 //食材情報を取得する 4 console.log('fired'); 5 let param2 = { 6 TableName: "syokuzai_stock", 7 Key: { 8 "syokuzai": event.body.itemid, 9 "userid": event.body.userid 10 }, 11 UpdateExpression: 'SET syokuzai_log = list_append(syokuzai_log, :list1_add_data)', 12 ExpressionAttributeValues: {':list1_add_data': [{'amount':event.body.num, 'price': event.body.price, 'shop': "no record", 'unit': event.body.unit }]}, 13 ReturnValues:"UPDATED_NEW" 14 }; 15 16 //console.log(param2); 17 return await DynamoDB.update(param2); 18 } catch (err) { 19 console.log(err); 20 } 21}

投稿2019/01/21 04:00

miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2019/01/22 03:15

Asyncとかcoとかモジュールをごっちゃに捉えていました。ご教示いただきまして、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問