我正在尝试在一个beforeSave触发器内使用Parse.Cloud.httpRequest Promise加载图像,但是显然没有调用此过程。错误回调被调用,但是错误消息始终为空。
可以将其保存为事前触发吗?还是因为我正在foreach内执行此操作而发生了?
消息“在加载imageUrl后,pablo#”没有出现在Parses日志中,并且出现了消息“保存用户图片>>>时出错”,但是error.text为空
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()返回由图像数据履行的承诺:文档对此尚不明确,但暗示不这样,(4)最后,让我们将图像内容分解为一个,承诺返回功能,因此更容易看到发生了什么...
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
中已经假定的更多的权限。