我正在尝试在一个 beforeSave 触发器内使用 Parse.Cloud.httpRequest promise 加载图像,但显然这个 promise 没有被调用。调用错误回调,但错误消息始终为空。
是否可以将其放入保存前触发器中?或者可能是因为我在 foreach 内部执行此操作而发生的?
解析日志中没有出现消息“pablo# after load imageUrl”,并且出现消息“保存用户图片时出错>>>”,但错误文本为空
Parse.Cloud.beforeSave(Parse.User, function(request, response) {
Parse.Cloud.useMasterKey();
response.success();
var found = false;
console.log(request.object.dirtyKeys());
for (dirtyKey in request.object.dirtyKeys()) {
if (request.object.dirtyKeys()[dirtyKey] === "imageurl") {
found = true;
Parse.Cloud.httpRequest({
url: request.object.get("imageurl")
}).then(function(response) {
console.log("pablo# after load imageUrl");
var image = new Image();
return image.setData(response.buffer);
}).then(function(image) {
return image.data();
}).then(function(buffer) {
var base64 = buffer.toString("base64");
var fileTitle = request.object.id + ".png";
console.log(fileTitle);
var file = new Parse.File(String(fileTitle), { base64: base64 });
return file.save();
}).then(function(file) {
request.object.set("profileImage", file);
console.log('success');
response.success();
}, function(error) {
console.error(error);
response.error("error when save user picture>>> " + error.text);
});
}
}
if(!found){
response.success();
}
});
最佳答案
只需对代码进行一些改进,这一切都是可行的:(1)不要立即调用 success() ,否则什么也不会发生,(2)不需要循环脏键,因为我们只是检查其中之一是否存在,(3) 您的代码假设 image.setData() 返回图像数据履行的 promise :文档对此不清楚,但暗示不然,(4) 最后,让我们将图像内容分解为一个单一的 promise 返回函数,因此更容易看到发生了什么......
Parse.Cloud.beforeSave(Parse.User, function(request, response) {
fetchAndSaveUserImage(request.object).then(function() {
response.success();
}, function(error) {
response.error(error);
});
}
function fetchAndSaveUserImage(user) {
if (user.dirtyKeys().indexOf("imageurl") == -1) { return false; }
var image = new Image(); // more like docs, so we have the image in any block below
var params = { url: request.object.get("imageurl") };
return Parse.Cloud.httpRequest(params).then(function(response) {
console.log("pablo# after load imageUrl");
return image.setData(response.buffer);
}).then(function() {
return image.data(); // this is likely the same as response.buffer, but the docs do it, so just to be certain...
}).then(function(buffer) {
var base64 = buffer.toString("base64");
var fileTitle = user.id + ".png";
console.log(fileTitle);
var file = new Parse.File(String(fileTitle), { base64: base64 });
return file.save();
}).then(function(file) {
request.object.set("profileImage", file);
return true;
});
}
顺便说一句,我省略了 useMasterKey
,因为我发现代码中没有任何内容需要比用户的 beforeSave
中已经假定的权限更多的权限。
关于javascript - 解析: using httpRequest to load image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34358353/