我需要在异步瀑布系列中保存到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);
}
[...]