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

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

新規登録して質問してみよう
ただいま回答率
85.48%
AWS(Amazon Web Services)

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2456閲覧

AWS Lambdaを用いて複数DBからデータを取得するAPIを作りたい

r-kurokw

総合スコア14

AWS(Amazon Web Services)

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/06/04 12:38

編集2018/06/04 12:39

実現したいこと

複数DBを検索して、データを取得するAPIを作りたい

そのために、下記のプログラムについてアドバイスいただければと思います

環境

AWS Lambda: Node.js 6.10
データベース: DynamoDB

現状

お世話になります。

Node.jsを用いて、APIを開発しております。
複数のDynamoDBに存在するデータを検索したいのですが、うまくいっておりません。

var AWS = require("aws-sdk"); var dynamo = new AWS.DynamoDB.DocumentClient(); var tableName = "データベース"; var common = require("インポートファイル"); exports.handler = (event, context, callback) => { var response = common.response(); if (!event.queryStringParameters) // クエリの入力判定処理 if (!event.queryStringParameters.uid) // クエリの入力判定処理 var param1 = { "TableName": tableName, ProjectionExpression: "取得するデータ", FilterExpression: "判定条件", ExpressionAttributeNames: { // 変数を置換 }, ExpressionAttributeValues: { } }; dynamo.scan(param1, function(err1, data1) { if (err1) { response.statusCode = 500; response.body = JSON.stringify({ "message": err1 }); } else { var result = []; if (data1.Items) { data1.Items.forEach(function(val) { var param2 = { "TableName": "データベース名", ProjectionExpression: "取得する変数", FilterExpression: "判定条件", ExpressionAttributeNames: { // 変数を置換 }, ExpressionAttributeValues: { } }; console.log(param2); dynamo.scan(param2, function(err2, data2) { console.log(data2); if (err2) { response.statusCode = 500; response.body = JSON.stringify({ "message": err2 }); } else { console.log(data2.Items); result[result.length] = data2.Items; } return; }); }); response.body = JSON.stringify(result); callback(null, response); return; } } }); };

上記のプログラムを実行すると、dynamodb.scan (param2直前の

console.log(param2);

では、正しい結果が得られているのですが、dynamodb.scan (param2直後の

console.log(data2);

では、何も結果が返ってきません。。。

(そもそもデータがないわけではなく、判定条件も間違ってないと思われます。
スキャン数はデータベースのデータ数とも一致しております。)

上記のプログラムにに間違っている箇所があれば教えていただきたいです。
また、より良い実装があれば、アドバイスが欲しいです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

dynamodb.scan は非同期処理なので、ちゃんと取り回しをしてあげなければいけません。
上記のソースコードだと、2回目の dynamodb.scan の処理が終わる前に console.log が実行されていると思われます。

現在LambdaはNode.js8.10が使用できるので、 async/await を使えば割と簡単に実現できます。

投稿2018/06/07 05:19

ryo-is

総合スコア152

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

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

r-kurokw

2018/06/07 05:25 編集

ご回答いただきまして、誠にありがとうございます。 当方でもいろいろ調べてみたのですが、仰る通り非同期処理が悪さしているようですね。 Promiseを用いることで、同期処理のように扱うことができ、無事に解決しました。 また、ryo-isさんが仰るようにasync/awaitを用いることで、Promiseよりもコードが簡潔に書くことができ、同期処理を実現できそうですので、こちらの方法も試してみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問