我正在使用 imagemin 来压缩文件,因为它们正在上传到我们的 NodeJS 服务器。下面的逻辑是一个简短的片段,用于解释正在发生的事情。所有这些都有效,但我正在尝试找出一种更有效的方法/最佳实践来使其更加优雅。
我正在寻找的是一种只调用一次 TaskModel 查询的方法,当 imagemin.run 完成时,用生成的 base64Images 更新数据库。正在尝试一些异步任务,但想先了解基础知识!
Imagemin链接:https://github.com/imagemin/imagemin
var fileList = [].concat(req.files.userFile);
for (var x = 0; x < fileList.length; x++) {
var fileItem = fileList[x];
var imagemin = new Imagemin()
.src(fileItem.path)
.use(Imagemin.jpegtran({progressive: true}))
.use(Imagemin.pngquant());
imagemin.run(function (err, files) {
if (err) {
console.log('Error on optmization!' + err);
}
files.forEach(function (tmpFile) {
var base64Image = new Buffer(tmpFile.contents).toString('base64');
TaskModel.findById(taskId, function (err, tmpTask) {
tmpTask.imgs.push({
bin: base64Image
})
tmpTask.save(function (err) {
if (!err) {
console.log("Image compressed and task updated");
} else {
console.log(err);
}
});
})
});
});
}
最佳答案
使用异步库:https://github.com/caolan/async
var fileList = [].concat(req.files.userFile);
var minified = [];
async.each(fileList, function(fileItem, done){
var imagemin = new Imagemin()
.src(fileItem.path)
.use(Imagemin.jpegtran({progressive: true}))
.use(Imagemin.pngquant());
imagemin.run(function (err, files) {
if(err){
console.log('Error on optmization!' + err);
return done(err);
}
if(files && files.length){
minified.push(files[0]);
}
done();
});
}, function(err){
if(err){
console.log('error during minfication', err)
return next(err); //assumes you're using express with a next parameter
}
TaskModel.findById(taskId, function (err, tmpTask) {
if(err){
console.log('unknown taxk', err);
return next(err);
}
for (var x = 0; x < minified.length; x++) {
var f = minified[x]
var base64Image = new Buffer(f.contents).toString('base64');
tmpTask.imgs.push({bin:base64Image});
}
tmpTask.save(function (err) {
if (!err) {
console.log("Image compressed and task updated");
} else {
console.log(err);
return next(err);
}
});
});
});
关于javascript - 在事件流期间更新数据库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27042600/