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

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

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

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

Node.js

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

Q&A

解決済

1回答

1021閲覧

Node.js Bodyに値を引き渡す方法

Ochonansan

総合スコア57

AWS Lambda

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

Node.js

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

0グッド

0クリップ

投稿2021/06/21 00:40

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

以下のコードにて、外部のメールサービスを叩きメールを送信するスクリプトを書きました。
メール本文となるBody文は固定文字列ではなく、都度外部のデータベースから取得したデータを格納した引数にて指定をしたいと考えています。
※具体的にはAWS DynamoDB内のテーブル情報をメール文にしたい。

Node.js

1 2//DynamoDBの処理は省略 3//以下よりDBから取得したデータを、[DBData]に格納 4DynamoDB.get(params, function(err, data){ 5 if(err){ 6 console.log(err); 7 }else{ 8 console.log(data); 9**//Bodyに使いたい引数。** 10 var DBData = data; 11 12 const params2 = { 13 Destination:{ 14 ToAddresses: ['test@mail.com'] 15 }, 16 Message: { 17**//以下のBodyに[DBData]を渡したい。** 18 Body: { Text: { Data: 'お問い合わせがありました', DBData } }, 19 Subject: { Data: 'test' } 20 }, 21 Source: 'test@mail.com' 22 }; 23**//上記で作成したメールをAWS SESで送信** 24 25 ses.sendEmail(params2, function (err, data) { 26 if (err) { 27 console.log(err); 28 context.fail(err); 29 } 30 else 31 { 32 console.log(data); 33 context.succeed(data); 34 } 35 }); 36} 37}); 38};

上記コードで実施した所、以下のエラーが出てしまう為、値が参照できていないと思うのですが、
何かアドバイス頂けたら嬉しいです。

2021-06-18T10:19:30.962Z d9ba020f-1d16-470c-839b-d48613207d02 ERROR Invoke Error { "errorType": "UnexpectedParameter", "errorMessage": "Unexpected key 'DBData' found in params.Message.Body.Text", "code": "UnexpectedParameter", "message": "Unexpected key 'DBData' found in params.Message.Body.Text",

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

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

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

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

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

guest

回答1

0

ベストアンサー

上記コードで実施した所、以下のエラーが出てしまう為、値が参照できていないと思うのですが、

エラー文
Unexpected key 'DBData' found in params.Message.Body.Text

日本語訳: Params.Message.Body.Textに予期しないキー「DBData」が見つかりました

Body: { Text: { Data: 'お問い合わせがありました', DBData } },

ここで下記のようなオブジェクトを定義しています。

js

1{ 2 Body: { 3 Text: { 4 Data: 'お問い合わせがありました', 5 DBData: DBData // Shorthand property names (ES2015) 6 } 7 } 8}

このDBData: DBDataってキーを勝手に宣言していいのかよって思いますし、
事実「そんなキーあり得ないので使ったらダメですよ」って書かれていますよね。

ただまぁ、エラーメッセージは私も先輩から
「なんでお前エラーメッセージ読まずに騒ぐんだよ」と何度も叱られつつ
涙目になって読んでいく内に頭に入ってくるようになった経緯があります。


さて、解決策です。

まぁ一度console.log(DBData)等の行を作って出力結果を確認しても良いと思いますが、
Text: {Data}Dataが文字列しか許されてないように思えます。

なのでDBDataを文字列化してねじ込む必要があります。
このメモリ空間上に存在する値を文字列に変換する行為をシリアライズと呼びます。

シリアライズには様々な手法がありますが、
一般的かつ簡易的な方法はJSON化することでしょうか。
ちょっとデベロッパーツールで確認してみましょうか。

# 適当なオブジェクトを括弧で包み、toStringメソッドで文字列化する > ({name: "taro"}).toString() "[object Object]" # JSONに変換する > JSON.stringify({name: "taro"}) "{\"name\":\"taro\"}" # 文字列のプロパティにアクセスして文字を取り出した方が良いかもね > ({name: "taro"}).name "taro"

という訳で実際にコードとして書き出します。
変数を使って文字列を表現したい場合はテンプレートリテラルを使うと良いでしょう。

js

1 Body: { Text: { Data: `お問い合わせがありました ${JSON.stringify(DBData)}`} },

簡易的に対応するならこんな感じです。

投稿2021/06/21 01:23

miyabi-sun

総合スコア21158

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

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

Ochonansan

2021/06/21 01:59

ご回答頂きましてありがとうございます! ちょうど先程、JSON化する方法があることを見つけたので、 ご教示頂いた内容とは少し違いますが解決できました! //////////// var DBData = JSON.stringify(data); console.log(DBData); const params2 = { Destination:{ ToAddresses: ['mail@mail.com'], }, Message: { Body: { Text:{ Data: DBData, }, },
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問