前提・実現したいこと
下記の順で処理を動かしたいです。
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/ツールのバージョンなど)
汚いコードで恥ずかしい限りですが、なにとぞアドバイスをお願いします・・・
あなたの回答
tips
プレビュー