将 mysql 集成到瀑布异步中



我需要在异步瀑布系列中保存到db。

我尝试在清理功能之后集成这两个功能

        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,直到调用回调。

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

我强烈建议您使用 knex.js相反,它默认返回 promise,如果您想在异步瀑布中使用它(并等待解析(,您可以调用 .asCallback .

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

如果瀑布函数有响应,则此响应将自动作为第一个参数添加到下一个函数中。在我的代码中,错误很简单(晚上睡觉后(,s3.deleteObject 和 s3.putObject 有响应,这个响应需要设置为第一个参数,回调设置为最后一个,正如你所说我只使用回调作为参数(下一个(,这破坏了我的代码。

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

相关内容

  • 没有找到相关文章

最新更新