2017-01-21 4 views
0

私はプロジェクトに取り組んでいます。 Mongooseを介してデータベースに保存しているデータがあります。フィールドの1つは「サムネイル」フィールドです。基本的にファイルがサーバーにアップロードされた後、この関数 'addChildren'が呼び出され、ファイルに関するデータがデータベースに保存されます。Promise.mapへの約束を得るには?

私はfs.readFileでファイル(画像、テキストなど)を読み取り、次にnode-canvasを使用してファイルをbase64に変換しています。

ここに問題があります。これらはfs.readFileSyncを使用するとすべて動作します。しかし、それは私が望むものではありません。値を適切に取得し、それをデータベースに保存する前に、「サムネイル」に格納する方法について、いくつかのガイダンスが必要です。

addChildren(files, owner) { 
    return Promise.map(files, file => new module.exports({ 
    _id: file.contentType === FOLDER_TYPE ? new Types.ObjectId() : file.key.match(/[^\/]+$/)[0], 
    ancestors: [], 
    name: file.originalname, 
    size: file.size, 
    type: file.contentType, 
    thumbnail: this.getThumbnail(file.key, file.contentType), 
    owner: file.contentType === FOLDER_TYPE ? undefined : owner, 
    permissions: null, 
    designroom: this.designroom 
    }).save()); 
} 
// Note: Key is essentially the unique file-path. 
getThumbnail(key, type) { 
    return new Promise(function(resolve, reject) { 
    var canvas = new Canvas(300, 200); 
    var Image = Canvas.Image; 
    var ctx = canvas.getContext('2d'); 
    var fileURL = "[url to file goes here]" + key +"/[filename]"; 

    switch (type) { 
     case 'image/jpeg': 
     fs.readFile(fileURL, function(err, data) { 
      if (err) { 
      reject (err); 
      } else { 
      var img = new Image; 
      img.src = data; 
      ctx.drawImage(img, 0, 0, img.width/canvas.width, img.height/canvas.height); 
      var result = canvas.toDataURL(); 
      console.log(result); 
      resolve(result) 
      } 
     }); 
     break; 
    } 
    }); 

} 

答えて

0

getThumbnailは約束を返すので、オブジェクトの作成中に同期してresulにアクセスすることはできませんので、あなたのスニペットは動作しません。あなたはgetThumbnail後のオブジェクトを作成する必要があり

が解決されます。

return Promise.map(files, file => (
    this.getThumbnail(/* ... */).then(thumbnail => (
     new module.exports({ 
      thumbnail, 
      // other fields... 
     }).save() 
    ) 
)); 
+0

これは正しかったです!ありがとう! – Alex