在瀑布异步中集成 mysql

Integrate mysql in waterfall async

我需要保存到异步瀑布系列中的数据库。

我尝试在 clean 函数之后整合这两个函数

        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)
            }

问题是这两个函数阻塞了代码的执行。如何将它集成到下面的函数中?我试图将函数包装在 promise 中,但它也不起作用。



    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;
        }
    );

异步水流的目的是阻塞 waterfall 直到回调被调用。

P.S。通常你不应该每次都创建一个新的数据库连接。连接应该在应用程序启动时完成一次,并在需要时随时使用。

我强烈建议您改用 knex.js,它 return 默认承诺,如果您想在异步瀑布中使用它(并等待解决),您可以调用 .asCallback.

我已经找到问题了,如果有人在这里遇到同样的问题我的解决方案:

如果瀑布函数有响应,该响应会自动添加为下一个函数的第一个参数。在我的代码中,错误很简单(经过一夜的睡眠),s3.deleteObject 和 s3.putObject 有响应,这个响应需要设置为第一个参数,回调作为最后一个,正如你所说我已经使用过只有回调作为参数(下一个),这破坏了我的代码。

[...]

 function upload(next) {

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

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

            }

[...]