将MySQL集成到瀑布异步中

时间:2019-06-20 15:38:09

标签: mysql node.js waterfall

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

我试图在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;
        }
    );

2 个答案:

答案 0 :(得分:0)

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

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

我强烈建议您改用knex.js,它默认会返回promise,如果您想在异步瀑布内使用它(并等待解析),可以致电.asCallback

答案 1 :(得分:0)

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

如果瀑布函数具有响应,则此响应将自动添加为下一个函数中的第一个参数。在我的代码中,错误很简单(一夜熟睡),s3.deleteObject和s3.putObject有响应,此响应需要设置为第一个参数,而回调必须设置为最后一个,因为您说我只使用了回调作为参数(下一个),这破坏了我的代码。

[...]

 function upload(next) {

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

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

            }

[...]