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

标签 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);
                            }
                        });
                    })
                });
            });
        }

最佳答案

使用异步库: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/

相关文章:

javascript - 如何使我的错误能够显示错误所在的行和文件

java - Spring MongoDB : Aggregation first record base on date

node.js - 监控 MongoDB "background operations"?

javascript - 在多个对象中查找相同的键

javascript - 在 javascript 和 jquery 中处理数组中的对象

javascript - Jquery 在输入焦点上隐藏 DIV,被窗口滚动破坏

node.js - Discord 机器人无法显示表情 "sometimes"

javascript - 从数据库复制到剪贴板文本输出

angularjs - Protractor 不会暂停调试

node.js - 如何使用 node-mongodb-connection 进行 connect-mongo