Изменить размер изображения с обещанием в цикле - PullRequest
0 голосов
/ 19 июня 2019

У меня проблема с обещанием в цикле.Мне нужно зацикливаться на объекте js, в котором у меня есть информация о загруженном носителе.Может быть изображение, видео и аудио.Для изображения я хочу изменить его на лету с помощью jimp, а затем сохранить файл на s3 и информацию на БД.Проблема заключается в том, что сценарии завершаются без ошибок перед сжатием изображения.

Я пробовал другой подход для решения проблемы, например, использовать jimp без обещаний или определить jimp в асинхронной функции с помощьюРезультат изменения как ожидают но ничего.Как вы можете видеть, я использую массив dbg для отладки сценариев, вот результаты:

0: "1"
1: "2"
2: "0 3"
3: "after type condition"
4: "loop:0"
5: "1 3"
6: "after type condition"
7: "loop:1"
8: "2 3"
9: "after type condition"
10: "loop:2"

Как вы можете увидеть остановку функции перед входом внутрь функции jimp.

api.post('/posts/createpost', function(request) {
    return new Promise((resolve, reject) => {

        connectDb()
            .then( () => { return savePost() } )
            .then( () => { return iteratePostMedia() } )
            .then( () => { conn.release() } )
            .then( () => { resolve( { success : "done", audioPresigned : audioPresigned, videoPresigned : videoPresigned, postId : postId, dbg : dbg } ) } )
            .catch( (err) => { reject(err) } 

    });
}, {
    customAuthorizer: 'jwtAuth'
}); 

function connectDb(){
    return new Promise((resolve, reject) => {
      pool.getConnection(function(err, connection) {
          if (err) reject(err);
            conn = connection;
            resolve( connection );
        });
    });
}

function savePost(){
    return new Promise((resolve, reject) => {

        dbg.push("1"); //only for debug
        let sql = "INSERT INTO posts SET user_id = ?, content = ?, privacy = ?";
        conn.query(sql, [userId, "the content", 1, "POINT ("+userCoordDefault+")" ], function (error, results, fields) {
            if (error) {
                conn.release();
                reject(error);
            }else{
                postId = results.insertId;
                dbg.push("2");  //only for debug
            }
        })
    });
}


async function iteratePostMedia(){

    let results = [];
    for (let key in media) {
        let r = savePostMedia(key);
        results.push(r);
        dbg.push("loop:"+key);
    }
    return results;
}

function savePostMedia(key){
    return new Promise((resolve, reject) => {

        if ( media[key].type == 'image'){
            dbg.push(key+" 3"); //only for debug
            let base64Img = media[key].file.split(',')[1];
            Jimp.read( Buffer.from(base64Img, 'base64') )
              .then(image => {
                    dbg.push(key+" 4");
                    console.log("then image");

                    image.resize( imgWidth, Jimp.AUTO ).getBuffer(Jimp.AUTO, (err, buffer) => {
                        dbg.push(key+" 5");  //only for debug
                        let fileName = uuidV1()+'.jpg';
                        s3.putObject( {
                            Bucket: myBucket,
                            Key: fileName,
                            ACL: 'public-read',
                            ContentType : 'image/jpeg',
                            Body: buffer
                        }, ( err, status ) => {
                            if ( err !== null ){ console.log('s3 put error'); reject(err);  }
                                dbg.push(key+" 6");
                                let sql = "INSERT INTO media SET media_author = ?, media_type = ?, media_url = ?, media_status = ?, media_parent = ?";
                                conn.query(sql, [userId, 'image', fileName, 'active', postId], function (error, results, fields) {
                                    if (error) {
                                        conn.release();
                                        reject(error);
                                    }else{
                                        resolve( console.log('image saved') );
                                    }
                                })

                            //resolve('upload done')

                        });

                    });

              })
              .catch(err => {
                console.log(err);
                reject(err);
              });

        }else if ( media[key].type == 'audio' || media[key].type == 'video' ){

            let ext = media[key].name.split('.').pop();
            let fileName = uuidV1() + '.' + ext;
            let contentType = media[key].type + '/' + ext

            const params = {
                Expires: 60,
                Bucket: myBucket,
                Conditions: [["content-length-range", 100, 200000000]], // 100Byte - 200MB
                Fields: {
                    "Content-Type": contentType,
                    key: fileName
                }
            };

            s3.createPresignedPost(params, (err, data) => {
                if (err) {
                    reject(err);
                    return;
                }

                if ( media[key].type == 'video'){ videoPresigned = data }
                if ( media[key].type == 'audio'){ audioPresigned = data }    

                let sql = "INSERT INTO media SET media_author = ?, media_type = ?, media_url = ?, media_status = ?, media_parent = ?";
                conn.query(sql, [userId, media[key].type, fileName, 'active', postId], function (error, results, fields) {
                    if (error) {
                        conn.release();
                        reject(error);
                    }else{
                        resolve( console.log('video or audio saved') );
                    }
                })

            });

        }


        dbg.push("after type condition");

    }); // end promise
}

Я хочу перебрать все носители для сжатия и сохранения изображения.

...