将文件保存到GridFS的同步问题 - Node.JS / Express

时间:2013-01-18 00:30:09

标签: node.js mongodb express

我正在尝试将社交网络中的个人资料照片保存为我的“fs.files”和“fs.chunks”中的Facebook,我可以实现这一点,但我发现这样做的方式并不合适

我的步骤是:

  1. 使用Passport让用户登录Facebook;
  2. 将图片文件保存在磁盘上(内部应用程序文件夹);
  3. 打开并阅读图片文件并将其存储在正确的集合中(来自Mongo的文件和块)。
  4. 问题发生在第2步和第3步之间,因为在这种情况下保存磁盘上的文件不是最好的主意,并且在尝试将其存储在数据库上时会发生同步问题和延迟。

    我曾使用setTimeout javascript函数来实现它。但我知道,这太糟糕了。我想知道某种方式获取某种文件流并将其直接存储在GridFS上或使实际过程更有效:

    代码:

    从网址获取图片并保存(磁盘步骤)

    // processing image 'http://graph.facebook.com/' + user.uid + '/picture';
    // facebook -> disk
    var userProfilePhoto = user.provider + '_' + user.uid + '.png';
    
    request(user.photoURL)
        .pipe(fs.createWriteStream(configApp.temp_files + userProfilePhoto));
    

    获取保存在磁盘上的图片并将其存储在GridFS上

    setTimeout(function() {
        mongoFile.saveFile(user, true, userProfilePhoto, mimeType.mime_png, 
            function(err) {
                if (!err) {
                    user.save();
                }
            }
        );
    }, 5000);
    

    不幸的是我不得不使用setTimeout使它成为可能,没有它mongo只是插入“fs.files”并跳过“fs.chunks”因为文件尚未就绪 - 似乎没有保存爱好。

1 个答案:

答案 0 :(得分:0)

我做到了!

我替换了http-get的请求插件,所以当文件准备好后,我可以将它存储在MongoDB中。