javascript - 解析: using httpRequest to load image

标签 javascript parse-platform promise

我正在尝试在一个 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/

相关文章:

数组上的 JavaScript .map 并在满足条件时删除项目

javascript - 如果单击特定子项,则防止触发父级单击

javascript - flex 容器中的可折叠 div 也可以打开其他 div

javascript - 如何在 ES5 代码中生成 'endsWith' 和其他字符串函数

java - 使用Bootstrap多选时如何在服务器端获取所选值?

parse-platform - 将 Arduino Uno 与以太网扩展板连接到 parse.com 数据库

ios - 如何使用解析终止重复的用户 session ?

javascript - 在 uitableview 单元格中显示项目的评分

javascript - 带有数据数组的顺序 promise 链,如何解析 promise 链?

javascript - 如何用 Promises 写这个?