我正在尝试在一个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中已经假定的更多的权限。

09-10 10:45
查看更多