解析之前保存()云代码函数不起作用

Parse beforeSave() cloud code function not working

本文关键字:代码 函数 不起作用 保存      更新时间:2023-09-26

我添加了一个 beforeSave() 解析云函数,该函数定义无法正常工作。

这是背景:我有一个名为UserRewards的类,它有一个名为ParseRelation类型的user的列。它正好由 1 个关系组成,该关系具有 ParseUser 类型的单个对象。我想在此功能中设置一个新的列 pUser。它查找用户关系,在其中找到 ParseUser,并将 pUser 设置为该用户。

这是我的代码

Parse.Cloud.beforeSave("UserRewards", function(request, response) {
    var relation = request.object.relation("user");
    relation.query().find({
            success: function(list) {
                console.log("looked up relation");
                if (list.length > 0) {
                    var pUser = list[0];
                    request.object.set("pUser", pUser);
                    console.log("updated pUser");
                }
            },
                error: function(error) {
                console.error("unable to lookup relation");
            }
    });
    response.success();

});

当我更新用户奖励行时,正在调用此函数。但它什么都不做 - 没有任何控制台或错误日志。

有什么想法吗?

您的函数在查询完成之前运行 response.success(),从而取消它。 尝试。。。

Parse.Cloud.beforeSave("UserRewards", function(request, response) {
    var relation = request.object.relation("user");
    relation.query().find({
            success: function(list) {
                console.log("looked up relation");
                if (list.length > 0) {
                    var pUser = list[0];
                    request.object.set("pUser", pUser);
                    console.log("updated pUser");
                }
                response.success();
            },
                error: function(error) {
                console.error("unable to lookup relation");
                response.error(error);
            }
    });
});

或者,更容易用承诺来看待...

Parse.Cloud.beforeSave("UserRewards", function(request, response) {
    var relation = request.object.relation("user");
    relation.query().find().then(function(list) {
        console.log("looked up relation");
        if (list.length > 0) {
            var pUser = list[0];
            request.object.set("pUser", pUser);
            console.log("updated pUser");
        }
        response.success();
    }, function(error) {
        console.error("unable to lookup relation");
        response.error(error);
    });
});

编辑我想我将后续问题理解为要求将指针属性与关系属性同步,假设在保存之前只设置了其中一个。 这可以通过检测关系是否为空来完成。 如果是,请再执行一个异步步骤来获取指针...

Parse.Cloud.beforeSave("UserRewards", function(request, response) {
    var relation = request.object.relation("user");
    relation.query().find().then(function(list) {
        console.log("looked up relation");
        if (list.length > 0) {
            var pUser = list[0];
            request.object.set("pUser", pUser);
            console.log("updated pUser");
            return Parse.Promise.as();  // we're done, this will pass nothing to the next step
        } else {  // the relation is empty, so the user pointer must be set
            var pointer = request.object.get("pUser");
            return pointer.fetch();    // this will pass the pUser to the next step
        }
    }).then(function(pUser) {
        if (pUser) {
            // must have found an empty relation in the last step.  add the user pointer to it
            request.object.relation.add(pUser);
        }
        response.success();
    }, function(error) {
        console.error("unable to lookup relation");
        response.error(error);
    });
});

(请注意,代码未经测试)。