在事件流期间更新数据库的最佳实践

时间:2014-11-20 14:54:56

标签: javascript node.js mongodb express mongoose

我正在使用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);
                            }
                        });
                    })
                });
            });
        }

1 个答案:

答案 0 :(得分:1)

使用异步库: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);
            }
        });
    });
});