所以我正在开展一个项目。我有通过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;
}
});
}
答案 0 :(得分:0)
您的代码段不起作用,因为getThumbnail
会返回一个承诺,因此您无法在创建对象时同步访问其结果。
getThumbnail
解决后,您需要创建对象:
return Promise.map(files, file => (
this.getThumbnail(/* ... */).then(thumbnail => (
new module.exports({
thumbnail,
// other fields...
}).save()
)
));