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

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

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

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

Node.js

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

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

801閲覧

AWS Lambdaで、ディレクトリを分けた関数のasync/awaitが正しく動かない

RyoS_

総合スコア4

AWS Lambda

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

Node.js

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

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2021/06/27 04:51

編集2021/06/27 09:37

実現したいこと

LINE Botを作成中です。
クライアントのメッセージに対して返答ができるようにしたい。

コードの構成

srcディレクトリに記載して、コンパイルしたコードをnode_modulesと一緒にS3経由でLambdaにアップロードしています。

. ├── api/ │ ├── dist/(コンパイル後) │ ├── src/(コンパイル前) │ │ ├── Common/ │ │ │ └── Template │ │      │ │ └── ErrorMessage.ts │ │ │ └── Send │ │      │ │ └── SendErrorMessage.ts │ │ └── index.ts

設定

Lambda

Node.js 14.xを使用しています。

コード

index.ts

// パッケージのインストール import { ClientConfig, Client, WebhookEvent } from '@line/bot-sdk'; // モジュールを読み込む import { SendErrorMessage } from './Common/Send/SendErrorMessage'; // アクセストークンとチャンネルシークレットをenvから読み込む const clientConfig: ClientConfig = { channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || '', channelSecret: process.env.CHANNEL_SECRET || '', }; // インスタンス化 const client: Client = new Client(clientConfig); // 実行 exports.handler = async (event: any, context: any) => { const body: any = JSON.parse(event.body); const events: WebhookEvent[] = body.events; events.map( async (event: WebhookEvent): Promise<void> => { try { console.log('event: ' + JSON.stringify(event)); await SendErrorMessage(client, event); } catch (err) { console.log(err); } } ); };

Common/Template/ErrorMessage.ts

// パッケージを読み込む import { TextMessage } from '@line/bot-sdk'; export const ErrorMessageTemplate = (): Promise<TextMessage> => { const params: TextMessage = { type: 'text', text: 'ごめんなさい、このメッセージは対応していません。', }; return new Promise((resolve, reject) => { resolve(params); }); };

Common/Send/SendErrorMessage.ts

// パッケージを読み込む import { Client, WebhookEvent } from '@line/bot-sdk'; // モジュールを読み込む import { ErrorMessageTemplate } from '../Template/ErrorMessageTemplate'; export const SendButtonMessageOrErrorMessage = async ( client: Client, event: WebhookEvent ): Promise<void> => { try { if (event.type !== 'message' || event.message.type !== 'text') { return; } const { replyToken } = event; const { text } = event.message; const errorMessageTemplate = await ErrorMessageTemplate(); console.log('errorMessageTemplate: ' + JSON.stringify(errorMessageTemplate)); await client.replyMessage(replyToken, errorMessageTemplate); } catch (err) { console.log(err); } };

確認したこと

console.log('errorMessageTemplate: ' + JSON.stringify(errorMessageTemplate));のログ検証

CloudWatchで以下のメッセージが返ってきていることを確認しています。

errorMessageTemplate: { "type": "text", "text": "ごめんなさい、このメッセージは対応していません。" }

LINEのNode.jsのパッケージが以下です。
https://line.github.io/line-bot-sdk-nodejs/getting-started/basic-usage.html#synopsis

上記で、このように書かれています。

client.replyMessage(event.replyToken, { type: 'text', text: event.message.text });

メッセージが正しく取得できているので、こちらのコードも正しく動くだろうと考えました。

await client.replyMessage(replyToken, errorMessageTemplate);

try, catchで書いているのでエラーのログも書いてあるかなと確認しましたがありませんでした。

気になること

Promiseで渡さないと値を受け取れないのでしょうか?

Common/Template/ErrorMessage.tsのコードも最初は、以下のようにしていました。

// Load the package import { TextMessage } from '@line/bot-sdk'; export const ErrorMessageTemplate = (): TextMessage => { return { type: 'text', text: 'ごめんなさい、このメッセージは対応していません。', }; };

ただこれでは、returnの内容が返ってこなかったのでPromiseで書き換えました。

しかし、今回は同様に非同期のasync/awaitで書いており、Node14なので対応していると思うのですがうまくいきません。

原因とコードをどのように直すべきなのかアドバイスいただけますと幸いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

exports.handlerにある、

ts

1 events.map( 2 async (event: WebhookEvent): Promise<void> => { 3 try { 4 console.log('event: ' + JSON.stringify(event)); 5 await SendErrorMessage(client, event); 6 } catch (err) { 7 console.log(err); 8 } 9 } 10 );

この処理ですが、そもそもmap()関数は「配列内の値をコールバック関数の返値に置き換えた新しい配列を作る」ものなので、今回の用途ではfor-offorEach()が適切です。

投稿2021/07/16 06:21

kaito3desuyo

総合スコア143

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問