获得Promise.map承诺的价值?

时间:2017-01-21 18:02:59

标签: node.js typescript

所以我正在开展一个项目。我有通过Mongoose保存到数据库的数据 - 其中一个字段是'thumbnail'字段。基本上,在将文件上载到服务器之后,将调用此函数“addChildren”,并将有关该文件的数据保存到数据库中。

我正在使用fs.readFile读取文件(图像,文本等),然后使用node-canvas将文件转换为base64。

这是我的问题;当我使用fs.readFileSync时,所有这些都有效;但这不是我想要的。我需要一些指导,如何正确检索值并将其存储在'thumbnail'中,然后保存到数据库中。

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;
    }
  });

}

1 个答案:

答案 0 :(得分:0)

您的代码段不起作用,因为getThumbnail会返回一个承诺,因此您无法在创建对象时同步访问其结果。

getThumbnail解决后,您需要创建对象

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