在瀑布异步中集成 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);
}
[...]
我需要保存到异步瀑布系列中的数据库。
我尝试在 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);
}
[...]