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

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

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

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

Node.js

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

Q&A

0回答

658閲覧

node.jsで処理を同期的に動かしたい

rirako

総合スコア13

AWS Lambda

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

Node.js

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

0グッド

0クリップ

投稿2020/09/24 04:21

前提・実現したいこと

下記の順で処理を動かしたいです。
LINEで画像を受信する
TEMP(空の状態)に保管
TEMPの合計サイズ算出
合計サイズが最大サイズを超えていないか比較
TEMP内ファイルを指定フォルダにコピー
TEMP内を削除
最大サイズと合計サイズの差をメッセージをLINEで送信する

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

一つ一つの処理はうまくいくのですが、順序を決めて動かそうとするとうまくいきません。

実際に動かしてみると、下記のいずれかの結果になります。
1.すべて上記の通りに動く
2.画像がTEMPに保存されて処理が終わる
3.画像が指定フォルダにコピーされ、TEMPが削除されて処理が終わる
4.TEMPの合計サイズが0KBと判断されて応答メッセージが返される

該当のソースコード

node.js

1//メイン処理 2contents_get.get_image(global.messageid, contents_get.save_image).then((image_value) => { 3 contents_get.size_check('line-image-bucket').then((value) => { 4 console.log('value=' +value); 5 db_control.talk_line(body,value,context); 6 }).catch((error) => { 7 console.error(error); 8 }); 9 }).catch((error) => { 10 console.error(error); 11 });
exports.get_image = function(message_id,callback){ return new Promise((resolve,reject) => { // Request Headers var send_options = { host: 'api.line.me', path: '/v2/bot/message/'+message_id+'/content', headers: { "Content-type": "image/jpeg", "Authorization": " Bearer " + process.env.ACCESSTOKEN }, method:'GET', encoding: null };
exports.save_image = function(data){ var params = { Bucket: 'line-image-bucket', Key:global.userId + '/TEMP/'+ global.messageid+'.jpg', Body: Buffer.concat(data), ContentType: 'image/jpeg' }; s3.putObject(params, function(err, data){ console.log(err); }); };
exports.size_check =async function (bucketName){ return new Promise((resolve) => { var bucketParams = { Bucket : bucketName, Prefix: global.userId + '/TEMP' }; s3.listObjects(bucketParams,async function(err, data_obj) { if (err){ console.log("Error", err); } else{ var data_objsize = 0 ; console.log("Success", data_obj); data_obj.Contents.forEach(function(dat){ data_objsize = data_objsize +dat.Size; }); console.log('total_size'+ data_objsize); var album = await db_control.get_album(); var sum_size =data_objsize + album.Item.size; console.log('sum_size'+ sum_size); var remaining_size= album.Item.max_size - sum_size; remaining_size= remaining_size/1,048,576; if(remaining_size<0){ console.log('size_over'+ sum_size); resolve('最大サイズを超えています\n'+remaining_size); }else{ console.log('size_OK'+remaining_size); await module.exports.copy_temp('line-image-bucket'); await module.exports.emptyBucket('line-image-bucket'); resolve('残り容量:'+remaining_size); } } }); }); };

考えたこと

毎回処理の順番がバラバラだから起こることに差異が生じるのでは?
promiseの書き方がおかしい?
asyncとpromise統一したほうがいい?

補足情報(FW/ツールのバージョンなど)

汚いコードで恥ずかしい限りですが、なにとぞアドバイスをお願いします・・・

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

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

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

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

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

Zuishin

2020/09/26 04:49

contents_get.get_image が Promise を返していなかったり、exports.get_image が resolve を呼んでいなかったりするところで読むのをやめました。 一度にやろうとせず、まず画像を取得する関数で Promise を返し、それを呼び出して await で受け取ったものが必ず画像になるというところから作ってみてはどうでしょうか。
rirako

2020/09/26 10:35

Zuishin様 アドバイスありがとうございます! 読む価値なしとすら言ってもらえないので途方に暮れてました。細かいご指摘と方針の提案までいただき本当にありがたいです。そのように進めたいと思います。 ご指摘の箇所は作っている途中でpromiseの存在を知ったことや、中途半端な実装でも機能単位では動いてしまうことで発生した問題だと思うので、全体でも同じような間違いがないか調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問