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

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

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

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

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

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

JavaScript

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

Q&A

解決済

1回答

1683閲覧

Node.js async使用時にreturn値がnullになってしまう

Ochonansan

総合スコア57

AWS Lambda

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

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2021/07/26 05:49

編集2021/07/27 01:02

表題の件でのご質問投稿となります。

以下のコードにて、DynamoDBから取得した値を成型し、戻り値として返す事を考えています。
ですがデバックをしてみると、どうもDBからアイテムをゲットする処理が動いておらず、
return値がNullになってしまいました。

asyncを使用した場合はどこにawaitを入れればいいのかも分からず、
asyncを使用しない場合は最後まで処理されますがreturn値が返ってこずで力尽きてしまいました。

Node.js

1const AWS = require("aws-sdk"); 2require('date-utils'); 3const DynamoDB = new AWS.DynamoDB.DocumentClient({ region: "ap-northeast-1" }); 4 5exports.handler = async (event) => { 6//以下にて、DynamoDBの"No"列から、YYYYMMDD形式の本日の値をparams1に保存。 7 8 var dt = new Date(); 9 var Todaytmp = dt.toFormat("YYYYMMDD"); 10 var Today = Number(Todaytmp); 11 console.log(Today); 12 var params1 = { 13 TableName: 'TableName', 14 Key: { 15 'No': Today, 16 } 17 }; 18 19//移行処理されない。。。 20//処理内容としては、上記で得たYYYYMMDDのデータをプライマリキーとしている、DynamoDBに問い合せ、その行を取得する。 21DynamoDB.get(params1, function(err, data){ 22 if(err){ 23 console.log(err); 24 }else{ 25 console.log(data); 26//色々成型ここから 27 var DBData = JSON.stringify(data); 28 var Call1tmp = DBData.replace(/}|{|"|Item|Call2(.*)|Call1|:|,/g,''); 29 var Call2tmp = DBData.replace(/}|{|"|Item|No(.*)|:|Call1(.*)Call2|,/g,''); 30 var Call3tmp = DBData.replace(/}|{|"|Item|Call4(.*)|:|Call1(.*)Call3|,/g,''); 31 var Call4tmp = DBData.replace(/}|{|"|Item(.*)Call4|:/g,''); 32//色々成型ここまで 33 34 console.log(Call1tmp); 35 console.log(Call2tmp); 36 console.log(Call3tmp); 37 console.log(Call4tmp); 38 39//戻り先の処理しやすいString形式に変換 40 var Call1 = String(Call1tmp); 41 var Call2 = String(Call2tmp); 42 var Call3 = String(Call3tmp); 43 var Call4 = String(Call4tmp); 44 console.log(Call1); 45 console.log(Call2); 46 console.log(Call3); 47 console.log(Call4); 48 return Call1; 49 } 50}); 51}; 52

どうしたら最後まできちんと処理されますでしょうか。

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

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

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

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

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

p19ljk

2021/07/27 01:51

「return値がNull」とありますが、return値とはどれのことを指しますか? このソース内では何も実行していないので、returnなどないようにみえますが。。。 これを呼び出している別のソースがあるのであれば、それも記述するとよいかと。 あと、インデントがぐちゃぐちゃなので修正してみてください。
Ochonansan

2021/07/27 05:21

ありがとうございます。 今後は質問の際、インデントも整理する事を心がけます。
guest

回答1

0

ベストアンサー

実際にDynamoDBを使ったことがあるわけではないので詳しいことは分かりませんが、DynamoDB.get(params1, function(...のfunctionはコールバック関数だと思うので、この関数内でreturnを使っても、それは親の関数exports.handlerのreturnではなく、あくまでもコールバック関数にとってのreturnにしかならないと思います。

Call1を外に出すには、Promiseとawaitでコールバック関数の返り値をキャッチする必要があるように思います。

js

1exports.handler = async event => { 2 //以下にて、DynamoDBの"No"列から、YYYYMMDD形式の本日の値をparams1に保存。 3 var dt = new Date(); 4 var Todaytmp = dt.toFormat('YYYYMMDD'); 5 var Today = Number(Todaytmp); 6 console.log(Today); 7 var params1 = { 8 TableName: 'TableName', 9 Key: { 10 'No': Today, 11 } 12 }; 13 14 // (!) PromiseとawaitでdataをJSON.stringifyしながらキャッチ 15 var DBData = await new Promise((resolve, reject) => { 16 DynamoDB.get(params1, (err, data) => { 17 if (err) { 18 console.log(err); 19 reject(err); 20 } else { 21 console.log(data); 22 resolve(JSON.stringify(data)); 23 } 24 }); 25 }); 26 27 //色々成型ここから 28 var Call1tmp = DBData.replace(/}|{|"|Item|Call2(.*)|Call1|:|,/g, ''); 29 var Call2tmp = DBData.replace(/}|{|"|Item|No(.*)|:|Call1(.*)Call2|,/g, ''); 30 var Call3tmp = DBData.replace(/}|{|"|Item|Call4(.*)|:|Call1(.*)Call3|,/g, ''); 31 var Call4tmp = DBData.replace(/}|{|"|Item(.*)Call4|:/g, ''); 32 //色々成型ここまで 33 34 console.log(Call1tmp); 35 console.log(Call2tmp); 36 console.log(Call3tmp); 37 console.log(Call4tmp); 38 39 //戻り先の処理しやすいString形式に変換 40 var Call1 = String(Call1tmp); 41 var Call2 = String(Call2tmp); 42 var Call3 = String(Call3tmp); 43 var Call4 = String(Call4tmp); 44 45 console.log(Call1); 46 console.log(Call2); 47 console.log(Call3); 48 console.log(Call4); 49 50 return Call1; 51};

(蛇足ですが、折角JSONで受け取っているので、String化して正規表現でバラすのではなく、JSONのまま加工した方が良いように思います。)

投稿2021/07/27 02:41

nappy

総合スコア28

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

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

Ochonansan

2021/07/27 05:24

ありがとうございます。 はい、ご指摘の通り親の関数へのreturnが行いたかったのですが、配下のコールバック関数に返そうとしているようなコードになってしまっておりました。(まだその部分の知識もままなっておりませんでした。) ご教示頂いた通りのコードで実現したい事を達成できそうです。 また、加工の方法も自分が知っている内容に逃げてしまっていましたが、 今後の為定石通り遠回り無しの方法を考えてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問