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

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

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

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

Amazon DynamoDB

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

Node.js

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

Q&A

解決済

1回答

550閲覧

nodejsのfor文の外への変数のわたし方

shunn

総合スコア2

AWS Lambda

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

Amazon DynamoDB

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

Node.js

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

0グッド

0クリップ

投稿2022/09/16 01:49

実行環境:AWS Lambda Node.Js 16.x

ここに質問の内容を詳しく書いてください。
awsのlambda内でnode.js 16.xを利用してdyanamodb内のデータを抽出したいと考えております.
その中で、辞書型の中身を抜き出そうとした時にエラーが発生してしまいました。

実現したいこと

for文を要素の回数だけ実行して、for文内の変数をfor分外で利用した

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

{
"errorType": "ReferenceError",
"errorMessage": "to_list is not defined",
"trace": [
"ReferenceError: to_list is not defined",
" at Runtime.exports.handler (/var/task/index.js:25:17)",
" at processTicksAndRejections (node:internal/process/task_queues:96:5)"
]
}

START RequestId: 90261f40-1a40-46ab-a0f8-835001abed9e Version: $LATEST 2022-09-16T01:44:09.924Z 90261f40-1a40-46ab-a0f8-835001abed9e ERROR Invoke Error {"errorType":"ReferenceError","errorMessage":"to_list is not defined","stack":["ReferenceError: to_list is not defined"," at Runtime.exports.handler (/var/task/index.js:25:17)"," at processTicksAndRejections (node:internal/process/task_queues:96:5)"]} END RequestId: 90261f40-1a40-46ab-a0f8-835001abed9e REPORT RequestId: 90261f40-1a40-46ab-a0f8-835001abed9e Duration: 907.64 ms Billed Duration: 908 ms Memory Size: 128 MB Max Memory Used: 82 MB Init Duration: 417.13 ms

該当のソースコード

Node.js

1var aws = require('aws-sdk'); 2var dynamo = new aws.DynamoDB(); 3 4exports.handler = async (event) => { 5 let prm={ 6 tablename:"sample_table",//テーブル名 7 pk_name:"p_key",//パーテーションキーの名称 8 pk_prm:{S:"key1"},//検索パーテーションキーの指定 9 sk_name:"s_key",//ソートキーの名称 10 sk_prm:{N:"key1"},//検索ソートキーの指定 11 }; 12 let res= await dynamoquery_pksk(prm); 13 14 const to_list_num = Object.keys(res).length 15 16 for(var i = 0; i < to_list_num; i++) { 17 const to_list = res[i] 18 } 19 console.log(to_list) 20 return res; 21}; 22 23function dynamoquery_pksk(obj){ 24 return new Promise((resolve, reject) => { 25 let params = { 26 "TableName": obj.tablename, 27 "KeyConditionExpression": "#pk_name = :pk_prm and #sk_name < :sk_prm" ,//検索条件 パーテーションキーでのは=のみ 28 "ExpressionAttributeNames":{ 29 "#pk_name": obj.pk_name, 30 "#sk_name": obj.sk_name 31 }, 32 "ExpressionAttributeValues": { 33 ":pk_prm": obj.pk_prm, 34 ":sk_prm": obj.sk_prm, 35 } 36 }; 37 dynamo.query(params,function(err, data) { 38 if (err) { 39 reject(err, err); 40 } else { 41 resolve(data.Items); 42 } 43 }); 44 }); 45}

試したこと

cnsole.logの出力をfor分内で実行すると成功します。for文の外に変数を引渡す方法などはありますでしょうか?

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

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

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

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

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

int32_t

2022/09/16 02:00

to_list には最終的には何が入ってほしいのでしょうか?
shunn

2022/09/16 04:00 編集

たとえば{"A":"a","B":"b"}というデータがresのなかに入っていたとしたら、この実行した時には"b"という値がかえってきてほしいです。
shunn

2022/09/16 03:59

1回目といいますが、このプログラムを実行した時には"b"の値がかえってきてほしいです。
guest

回答1

0

ベストアンサー

直接の原因は、「for の中で宣言したlet/const変数はforの外では使えない」ということなので、for の外で変数を宣言すればよいです。

Object.keys() で列挙した最後のプロパティの値がほしい」ということであれば、for ループは不要です。 const to_list = res[Object.keys(res).pop()];
が、そもそも Object.keys() の結果の順番は決まっていないのでそういう処理をしてはいけません。

投稿2022/09/16 04:19

int32_t

総合スコア20850

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

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

shunn

2022/09/16 04:26

varで宣言したら出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問