Интеграция MySQL в водопад асинхронный - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно сохранить в БД в серии асинхронных водопадов.

Я пытался объединить эти две функции после чистой функции

        function connectDb(next) {
                pool.getConnection(function(err, connection) {
                  if (err) console.log(err);
                    conn = connection;
                }, next);
            },
        function saveDb(next) {
                let sql = "UPDATE media SET media_url = ? WHERE media_url = ?";
                conn.query(sql, [dstKey, srcKey], function (error, results, fields) {
                    if (error) {
                        conn.release();
                        console.log(error);
                    }else{
                        console.log("media db updated");
                    }
                }, next)
            }

Проблема в том, что эти две функции блокируют выполнение кода. Как я могу интегрировать это в функцию ниже? Я пытался обернуть функцию в обещание, но она также не работает.



    async.waterfall([
        function download(next) {
            s3.getObject({
                    //param
                },
                next);
            },
        function transform(response, next) {
            resizeMedia(response.Body ).then( ( file ) => { next();} ).catch( (err) => { reject(err) } ); }
        },
        function upload(next) {
            var fileData = fs.createReadStream('/tmp/'+dstKey);

            if (isVideo ) { var ContentType = 'video/mp4' }
            if (isAudio ) { var ContentType = 'audio/mp3' }            

            s3.putObject({
                    //param
                },
                next);
            },            
        function clean(next) {
            // Stream the transformed image to a different S3 bucket.
            fs.unlinkSync('/tmp/'+dstKey);

            s3.deleteObject({
                    //param
                },
                next);

            }
        ], function (err) {
            if (err) {
                console.error('Error');
                callback(null, "Error");
                return;
            } else {
                console.log('Success');
                callback(null, "Done");
                return;
            }

            callback(null, "Done");
            return;
        }
    );

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Я нашел проблему, если кто-то попадет в ту же проблему, вот мое решение:

Если функция водопада имеет ответ, этот ответ автоматически добавляется в качестве первого аргумента в следующую функцию. В моем коде ошибка была простой (после ночного сна), у s3.deleteObject и s3.putObject есть ответ, этот ответ должен быть установлен в качестве первого аргумента, а обратный вызов - в качестве последнего, как вы говорите, я использовал только обратный вызов как аргумент (следующий), и это сломало мой код.

[...]

 function upload(next) {

            s3.putObject({
                    //param
                },
                next);
            },            
        function clean(response, next) { // response in arguments

            s3.deleteObject({
                    //param
                },
                next);

            }

[...]

0 голосов
/ 20 июня 2019

Целью асинхронного потока воды является блокирование waterfall до тех пор, пока не будет вызван обратный вызов.

PS Обычно вам не следует каждый раз создавать новое соединение с БД.Соединение должно быть установлено один раз, когда приложение запускается и используется всякий раз, когда вам нужно.

Я настоятельно рекомендую вам использовать knex.js , вместо этого он возвращает обещания по умолчанию, и если вы хотитеиспользовать его внутри асинхронного водопада (и дождаться разрешения) вы можете позвонить .asCallback.

...