【问题标题】:Bulk upload attachments to couchDB using node.js nano module使用 node.js nano 模块将附件批量上传到 couchDB
【发布时间】:2012-12-19 16:58:42
【问题描述】:

我正在尝试使用 node.js 和 nano 将附件批量上传到 CouchDB。 首先,walk 模块用于查找上传文件夹中的所有文件并从中创建数组。 接下来,数组中的每个文件都应该通过 pipe 和 nano 模块插入到 CouchDB 中。 但是,最终的结果是只上传了一个附件。

var nano = require('nano')('http://localhost:5984')
var alice = nano.use('alice');
var fs = require('fs');
var walk = require('walk');
var files = [];

// Walker options
var walker = walk.walk('./uploads', {
    followLinks: false
});

// find all files and add to array
walker.on('file', function (root, stat, next) {
    files.push(root + '/' + stat.name);
    next();
});

walker.on('end', function () {
    // files array ["./uploads/2.jpg","./uploads/3.jpg","./uploads/1.jpg"]
    files.forEach(function (file) {
        //extract file name
        fname = file.split("/")[2]

        alice.get('rabbit', {revs_info: true}, function (err, body) {

                fs.createReadStream(file).pipe(

                    alice.attachment.insert('rabbit', fname, null, 'image/jpeg', {
                        rev: body._rev
                    }, function (err, body) {
                        if (!err) console.log(body);
                    })


                )


        });



    });


});

【问题讨论】:

    标签: javascript node.js couchdb attachment couchdb-nano


    【解决方案1】:

    这是因为您将异步 api 与同步的假设混合在一起。

    第一次请求后你会遇到冲突,导致rabbit文档发生了变化。

    你能用NANO_ENV=testing node yourapp.js确认吗?

    如果这是问题,我建议使用异步

    【讨论】:

    • 是这样。感谢您指出问题-我找到了有关流控制的教程并根据它修改了代码-以下是工作示例
    【解决方案2】:
    var nano = require('nano')('http://localhost:5984')
    var alice = nano.use('alice');
    var fs = require('fs');
    var walk = require('walk');
    var files = [];
    
    // Walker options
    var walker = walk.walk('./uploads', {
        followLinks: false
    });
    
    walker.on('file', function (root, stat, next) {
        files.push(root + '/' + stat.name);
        next();
    });
    
    walker.on('end', function () {
        series(files.shift());
    
    });
    
    
    
    function async(arg, callback) {
        setTimeout(function () {callback(arg); }, 100);
    }
    
    
    function final() {console.log('Done');}
    
    
    function series(item) {
        if (item) { 
            async(item, function (result) {
                fname = item.split("/")[2]
    
                alice.get('rabbit', { revs_info: true }, function (err, body) {
                    if (!err) {
    
                        fs.createReadStream(item).pipe(
                        alice.attachment.insert('rabbit', fname, null, 'image/jpeg', {
                            rev: body._rev
                        }, function (err, body) {
                            if (!err) console.log(body);
                        })
    
    
                        )
    
                    }
                });
    
                return series(files.shift());
            });
        } 
    
        else {
            return final();
        }
    }
    

    【讨论】:

    • 只是好奇,根据您对“异步”的定义,为什么会有 100 毫秒的延迟?为什么不是 0ms,表示 async 应该在当前执行堆栈完成后立即启动?只是想确保我没有遗漏节点或 js 的细微差别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2019-05-02
    • 2020-09-30
    相关资源
    最近更新 更多