问题描述
我有一个 Parse Cloud afterSave
触发器,我可以从中访问 obj,并且在 obj 内部有一个包含存储解析文件 img 的字段。
我想使用sharp来调整它的大小并将其保存在另一个字段中,但是当我使用sharp时我很挣扎并且出现错误。这是我在云触发器中已有的代码的摘要:
let file = obj.get("photo");
sharp(file)
.resize(250,250)
.then((data) => {
console.log("img-----",data);
})
.catch((err) => {
console.log("--Error--",err);
});
解决方法
经过一些研究,我设法弄清楚如何创建 Parse Cloud afterSave 触发器,该触发器调整大小然后保存 img,我找不到关于它的太多信息,所以我无法发布我的解决方案,以便其他人可以在有帮助的情况下使用它。
Parse.Cloud.afterSave("Landmarks",async (req) => {
const obj = req.object;
const objOriginal = req.original;
const file = obj.get("photo");
const condition = file && !file.equals(objOriginal.get("photo"));
if (condition) {
Parse.Cloud.httpRequest({ url: file.url() })
.then((res) => {
sharp(res.buffer)
.resize(250,250,{
fit: "fill",})
.toBuffer()
.then(async (dataBuffer) => {
const data = { base64: dataBuffer.toString("base64") };
const parseFile = new Parse.File(
"photo_thumbnail",data
);
await parseFile.save();
await obj.save({ photo_thumb: parseFile });
})
.catch((err) => {
console.log("--Sharp-Error--",err);
});
})
.catch((err) => {
console.log("--HTTP-Request-Error--",err);
});
} else {
console.log("--Photo was deleted or did not change--");
}
});
所以要稍微分解一下,我首先做的是获取 obj
和 objOriginal
,以便我可以比较它们并检查特定字段中的变化。这个条件是必要的,因为在我的情况下,我想在解析中保存调整大小的 img,否则会导致无限循环。
在那之后,我做了一个 Parse.Cloud.httpRequest({ url: file.url()}).then()
,这是我发现从 photo
获取缓冲区的方式。缓冲区存储在 res.buffer
中,我们需要它来进行锐化。
接下来我使用 sharp(res.buffer)
因为Sharp也接受缓冲区并将其调整为所需的尺寸(我使用了适合它的配置)。然后我们使用 .toBuffer()
将结果 img 转换为另一个缓冲区。此外,我使用 .then().catch()
块,如果sharp成功,我将输出的缓冲区转换为 base64 并将其传递给 Parse.File()
,请注意特定语法 { base64: 'insert buffer here' }
很重要。
最后我只保存文件和obj。这是最好的方法吗,绝对不是,但它是我发现可行的方法。另一种可能的解决方案是创建一个临时目录,而不是使用 buffers
和 base64
,将图像保存在那里,使用它们,然后删除该目录。我也试过这个,但在使它工作时遇到了问题。