如何在Save之前查询CloudCode中的对象?

2023-12-05

我正在尝试比较新对象original using 保存前的 CloudCode功能。我需要比较发送的字段update与现有的价值。问题是我无法正确获取对象。当我运行查询时,我总是从发送的对象中获取值。

UPDATE:我尝试了一种不同的方法,可以得到旧的寄存器(已经保存在解析中的寄存器)。但是在请求中发送的新请求被旧请求覆盖了。什么?!另一个问题是,即使代码发送了response.success(),更新未保存。我相信我在这里遗漏了一些非常明显的东西。或者我遇到了错误或其他什么......

新的方法

Parse.Cloud.beforeSave('Tasks', function(request, response) {
  if ( !request.object.isNew() )
  {
    var Task = Parse.Object.extend("Tasks");
    var newTask = request.object;
    var oldTask = new Task();
    oldTask.set("objectId", request.object.id);
    oldTask.fetch()
        .then( function( oldTask )
    {
        console.log(">>>>>> Old Task: " + oldTask.get("name") + " version: " + oldTask.get("version"));
        console.log("<<<<<< New Task: " + newTask.get("name") + " version: " + newTask.get("version"));
        response.success();
    }, function( error ) {
            response.error( error.message );
        }
    );
    }
});

OBJ SENT {"name":"LLL", "version":333}

LOG

 I2015-10-02T22:04:07.778Z]v175 before_save triggered for Tasks for user tAQf1nCWuz:
 Input: {"original":{"createdAt":"2015-10-02T17:47:34.143Z","name":"GGG","objectId":"VlJdk34b2A","updatedAt":"2015-10-02T21:57:37.765Z","version":111},"update":{"name":"LLL","version":333}}
 Result: Update changed to {}
 I2015-10-02T22:04:07.969Z]>>>>>> Old Task: GGG version: 111
 I2015-10-02T22:04:07.970Z]<<<<<< New Task: GGG version: 111

注意:我正在通过 cURL 和解析控制台测试登录。

保存前的 CloudCode

Parse.Cloud.beforeSave("Tasks", function( request, response) {
  var query = new Parse.Query("Tasks");
  query.get(request.object.id)
    .then(function (oldObj) {
        console.log("-------- OLD Task: " + oldObj.get("name") + " v: " + oldObj.get("version"));
        console.log("-------- NEW Task: " + request.object.get("name") + " v: " + request.object.get("version"));
    }).then(function () {
        response.success();
    }, function ( error) {
        response.error(error.message);
    }
  );
});

卷曲请求

curl -X PUT \
-H "Content-Type: application/json" \
-H "X-Parse-Application-Id: xxxxx" \
-H "X-Parse-REST-API-Key: xxxxx" \
-H "X-Parse-Session-Token: xxxx" \
-d "{\"name\":\"NEW_VALUE\", \"version\":9999}" \
https://api.parse.com/1/classes/Tasks/VlJdk34b2A

JSON 响应

"updatedAt": "2015-10-02T19:45:47.104Z"

LOG日志打印出originalnew值,但我也不知道如何访问它。

I2015-10-02T19:57:08.603Z]v160 before_save triggered for Tasks for user tAQf1nCWuz:
Input: {"original":{"createdAt":"2015-10-02T17:47:34.143Z","name":"OLD_VALUE","objectId":"VlJdk34b2A","updatedAt":"2015-10-02T19:45:47.104Z","version":0},"update":{"name":"NEW_VALUE","version":9999}}
Result: Update changed to {"name":"NEW_VALUE","version":9999}
I2015-10-02T19:57:08.901Z]-------- OLD Task: NEW_VALUE v: 9999
I2015-10-02T19:57:08.902Z]-------- NEW Task: NEW_VALUE v: 9999

经过大量测试和错误后,我可以弄清楚发生了什么。

结果发现Parse 正在将具有相同类和 id 的任何对象合并到一个实例中。这就是为什么我总是在数据库中注册对象或用户发送的对象的原因。老实说,我无法理解这种行为,但无论如何......

Parse javascript sdk 提供了一个名为的方法Parse.Object.disableSingeInstance link禁用此“功能”。但是,一旦调用该方法,所有已定义的对象都将变为未定义。这包括发送的对象。 Witch 意味着您无法保存发送的对象以供以后参考。

唯一的选择是保存发送的 obj 的键和值并稍后重新创建它。所以,我需要在调用之前捕获请求disableSingleInstance,将其转换为 JSON,然后禁用单个实例,获取数据库中保存的对象并使用保存的 JSON 重新创建发送的对象。

它不漂亮,而且绝对不是最有效的代码,但我找不到任何其他方法。如果有人有其他方法,请务必告诉我。

Parse.Cloud.beforeSave('Tasks', function(request, response) {
  if ( !request.object.isNew() ) {
    var id = request.object.id;
    var jsonReq;
    var Task = Parse.Object.extend("Tasks");
    var newTask = new Task;
    var oldTask = new Task;

    // getting new Obj
    var queryNewTask = new Parse.Query(Task);
    queryNewTask.get(id)
        .then(function (result) {
            newTask = result;

            // Saving values as a JSON to later reference
            jsonReq = result.toJSON();

            // Disable the merge of obj w/same class and id
            // It will also undefine all Parse objects,
            // including the one sent in the request
            Parse.Object.disableSingleInstance();

            // getting object saved in DB
            oldTask.set("objectId", id);
            return oldTask.fetch();
        }).then(function (result) {
            oldTask = result;

            // Recreating new Task sent
            for ( key in jsonReq ) {
                newTask.set( key, jsonReq[key]);
            }

            // Do your job here
        }, function (error) {
            response.error( error.message );
        }
    );
  }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Save之前查询CloudCode中的对象? 的相关文章

随机推荐

  • 为什么 Skylake 在单线程内存吞吐量方面比 Broadwell-E 好很多?

    我们有一个简单的内存吞吐量基准 它所做的只是对一大块内存重复进行memcpy 查看几台不同机器上的结果 针对 64 位编译 Skylake 机器的表现明显优于 Broadwell E 操作系统 Win10 64 处理器速度和 RAM 速度
  • Qt - 访问包路径

    Qt 文档 Mac 的差异 页面提供了以下用于访问应用程序的捆绑路径的代码 CFURLRef appUrlRef CFBundleCopyBundleURL CFBundleGetMainBundle CFStringRef macPath
  • C++11 中的自动引用

    我有一些麻烦about自动参考 const int i 1 auto ri1 i auto ri2 1 error 为什么是推导类型ri1 const int但不是ri2 Thanks Since i有类型const int but 1有类
  • android:单个文件的pathPattern

    我需要定义IntentFilter对于名为myfile ext 目前我的清单如下所示
  • NHibernate 标准查询 - 选择与连接实体不同的值

    我有一个 Person 实体 每个人都有一个国家 我想选择所有有人民的不同国家 此 Criteria 查询返回所有不同的 CountryID criteria SetProjection Projections Distinct Proje
  • 如何使用 matplotlib 绘制具有长度颜色渐变的 3d 箭袋图?给出错误“ValueError:对象对于所需数组来说太深”

    我想通过颜色编码来指示箭袋的长度 箭头称为箭袋吗 对于二维箭袋图来说这不是问题 Here已经完成了 对于 3D 投影来说 它很难失败 此代码重现了该问题 import matplotlib pyplot as plt import nump
  • 仅根据事例值调用方法的 switch 替代方案

    有没有可能用更短 可读的代码编写下一个开关 switch SomeValue case 001 return DoMethod1 break case 002 return DoMethod2 break etc 我在想以某种方式 Dict
  • 为什么实现接口的抽象类可能会错过接口方法之一的声明/实现?

    当您使用抽象类实现接口时 Java 中会发生一件奇怪的事情 接口的某些方法可能完全缺失 即既不存在抽象声明也不存在实际实现 但编译器不会抱怨 例如 给定接口 public interface IAnything void m1 void m
  • 在 Fortran 中传递指针参数

    我想知道编写以下代码的正确方法是什么 PROGRAM foo INTEGER x REAL KIND 8 TARGET DIMENSION 0 10 array REAL KIND 8 POINTER DIMENSION ptr ptr g
  • 如何获取控制台应用程序窗口的句柄

    有人可以告诉我如何在 C 中获取 Windows 控制台应用程序的句柄吗 在 Windows 窗体应用程序中 我通常会尝试this Handle 不确定它是否有效 但你可以尝试一下 IntPtr handle Process GetCurr
  • PowerShell 计划任务使用 Excel Com 对象运行脚本

    这是一些奇怪的行为 我有一个 PowerShell 脚本 可以将 XLSX 文件转换为 CSV 文件 该脚本在控制台中运行没有问题 尝试安排任务 脚本会导致 CSV 文件中没有数据 0 字节 在我的搜索中 我发现此 TechNet 论坛帖子
  • 如何使控制字符可见?

    我必须显示带有可见控制字符的字符串 例如 n tETC 我尝试过像这样的引用here 我也尝试过做类似的事情 Pattern pattern Pattern compile p Cntrl Matcher matcher pattern m
  • 如何将 2D 点反向投影为 3D?

    我在屏幕空间中有 4 个 2D 点 我需要将它们反向投影回 3D 空间 我知道这 4 个点中的每一个都是 3D 旋转的刚性矩形的一个角 并且我知道矩形的大小 我如何从中获取 3D 坐标 我没有使用任何特定的 API 也没有现有的投影矩阵 我
  • 将文件附加到 iCalendar

    我通过 SMTP 正确发送 iCalendar 会议请求 使用下面的代码 但是当我尝试附加文件时 该文件不会显示为 iCalendar 的一部分 在 Outlook 中打开 ics 后保存它时 整个文件数据已被删除 这是我正在使用的代码 S
  • 带有请求主体的 HttpGet android

    我尝试通过 HttpGet 在服务器上发出请求 但消息正文中应该是一个 json 对象 下面的代码不起作用 因为 unit id 和 sercret key 未在服务器正文消息中发送 我该怎么做 JSON对象 unit id 12345 s
  • 具有欧洲日期格式的 Sttotime

    我正在尝试使用 strtotime 转换以下日期 2009年7月9日 17 01 27 这是 9 月 7 日的欧洲 伦敦时区格式 该函数反转月份和日期 有什么解决方法吗 谢谢 Change for 似乎 PHP 得到了 作为美国格式 以及
  • 在键上使用 gpg --list-packets 的输出来获取 mpi 值以生成 s 表达式

    我正在尝试使用 gpg 生成的公钥来使用 libgcrypt 进行加密 我在密钥上使用了 list packet 命令来获取密钥的内容 并将 mpi 值解析为 s 表达式 因此 当我尝试使用公钥对会话密钥进行编码时 我收到错误 S 表达式中
  • 为什么 .NET 计时器的分辨率限制为 15 毫秒?

    请注意 我正在询问一些会使用类似的方法每 15 毫秒调用回调函数一次以上的情况System Threading Timer 我不是问如何使用类似的东西来准确地计算一段代码的时间System Diagnostics Stopwatch甚至Qu
  • WebSphere Portal 解码 URL

    如何解码 WebSphere Portal url 例如此网址 wps portal ut p c5 dY7LdoIwAAW hS9ICEnEZSBaKBSKkUfZcAKtKRYMKo 2X197XHtnObO4oAQ3TnJulRxbf
  • 如何在Save之前查询CloudCode中的对象?

    我正在尝试比较新对象与original using 保存前的 CloudCode功能 我需要比较发送的字段update与现有的价值 问题是我无法正确获取对象 当我运行查询时 我总是从发送的对象中获取值 UPDATE 我尝试了一种不同的方法