1

我有 NodeJS restify 设置,我正在使用 mongoose-attachments 将图像附加到我的用户模型,并将图像存储在 S3 存储桶中。

我还允许用户使用 Passport.JS 使用 Facebook、Google 等进行注册。

问题是 mongoose-attachments 在调用 .attach() 函数时需要一个本地文件引用,而 PassportJS 提供了一个远程 URL - 所以我需要下载图像然后从 tmp 附加它。

我应该如何使用 NodeJS 来解决这个问题?我可以使用一个好的模块吗?

4

2 回答 2

1

我设法通过请求模块找到了一个可行的解决方案。它可以满足我的需要,而且它似乎是任何 Web 应用程序的全面工具。这是有效的代码:

var userImageProp = {};
if ((profile.picture) && (profile.picture.data.is_silhouette == false)) {

    var pictureURL = 'https://graph.facebook.com/'+ profile.id +'/picture?type=large';    

    // Determine file name.
    var filename = profile.picture.data.url.replace(/^.*[\\\/]/, '');

    // Precreate stream and define callback.
    var picStream = fs.createWriteStream('/tmp/'+filename);
    picStream.on('close', function() {
        console.log('Downloaded '+filename);
        userImageProp.path = '/tmp/'+filename;
        finishSave(user, userImageProp);
    });

    // Get and save file.
    request(pictureURL).pipe(picStream);

} else {
    userImageProp.path = config.root + '/defaults/img/faceless_'+user.gender.toLowerCase()+'.png';
    finishSave(user, userImageProp);
}

function finishSave(user, userImageProp) {
    user.attach('userImage', userImageProp, function(err) {
        console.dir(err);
        if (err) { return done(new restify.InternalError(err)); }
        user.save(function (err, user) {
            if (err) { return done(new restify.InternalError(err)); }
            // Saved successfully. Return user for login, and forward client to complete user creation.
            return done(null, user, '/#/sign-up/facebook/save');
        });
    });
}

感谢这些线程帮助我提出了这个解决方案:

于 2013-09-05T15:31:40.243 回答
0

你看过mongoose-attachments-aws2js

于 2013-09-05T05:26:18.807 回答