【问题标题】:Synchronous issue to save a file into GridFS - Node.JS/Express将文件保存到 GridFS 的同步问题 - Node.JS/Express
【发布时间】:2013-01-19 01:07:39
【问题描述】:

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

我的步骤是:

  1. 使用 Passport 让用户登录 Facebook;
  2. 将图片文件保存在磁盘上(一个内部应用程序文件夹);
  3. 打开并读取图片文件并将其存储在正确的集合中(来自 Mongo 的文件和块)。

问题发生在第 2 步和第 3 步之间,因为在这种情况下将文件保存在磁盘上并不是最好的主意,并且在尝试将文件存储在数据库上时会出现同步问题和延迟。

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

代码:

从 URL 中获取图片并保存(磁盘步骤)

// 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”,因为文件尚未准备好 - 似乎尚未保存。

【问题讨论】:

  • 您使用的是什么节点驱动程序?标准节点驱动程序 GridFS 文档在这里:mongodb.github.com/node-mongodb-native/api-generated/…
  • 我正在使用默认的 mongo 驱动程序而不是 mongoose 甚至 mongojs 用于 GridFS。我面临的问题是关于将图片文件写入磁盘和稍后保存到数据库之间的同步。
  • 上面的代码可以工作,但仍然很糟糕,因为那里有两件事:1 - 我必须一次将文件写入磁盘; 2 - 我必须从磁盘打开并读取此文件并写入数据库。我想要一种直接的方法来做到这一点,更高效,并且不需要我创建的解决同步问题的解决方法代码。

标签: node.js mongodb express


【解决方案1】:

我做到了!

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

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 2015-07-18
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2012-04-29
    • 2015-09-23
    相关资源
    最近更新 更多