【问题标题】:Property unset by CloudCode is overwritten by local Parse cacheCloudCode 未设置的属性被本地 Parse 缓存覆盖
【发布时间】:2017-03-29 15:03:15
【问题描述】:

我有一个 Cloud Code 函数,它传递现有 Parse 对象的 id,操作并保存该对象,并将其返回给客户端(使用 JS SDK 实现)。这通常效果很好,但有一个例外:如果 CC 函数取消设置先前设置的属性,客户端仍会在返回的对象中看到旧值(即使该属性在数据库中正确保存为 undefined);只有当客户端重新获取对象时,该属性才具有正确的值。

所以这里有一个简单的 CC 功能暴露了这个问题:

function manipulate(req, res) {
  new Parse.Query('MyObject')
    .get(req.params.id)
    .then(obj => {
      obj.unset('foo');
      return obj.save();
    })
    .then(obj => res.success(obj));
}

这是客户端代码:

obj.set('foo', 'bar'); // obj was fetched with a query
Parse.Cloud.run('manipulate', { id: obj.id })
  .then(updatedObj => {
    // 'foo' should be undefined but still is set to 'bar'
    assert(updatedObj.get('foo') === 'bar');
  });

显然返回的对象不包含有关属性未设置这一事实的信息,因此 Parse 继续使用缓存值 foo

我认为这是一个错误,但如果我在使用 API 时犯了任何错误,我会非常乐意被证明是错误的。欢迎提供有关如何解决此问题的任何提示!

请注意:我不想使用obj.set('foo', null)(这实际上会起作用),因为我想避免有两个不同的值(nullundefined)代表“未设置”状态。

【问题讨论】:

    标签: parse-platform parse-server parse-javascript-sdk


    【解决方案1】:

    我最终使用了一个丑陋的解决方法:每当我调用一个可能取消设置属性的函数时,我都会在返回的对象上调用 fetch 以确保我没有看到缓存值。一个糟糕的解决方案性能方面,因为我有第二个客户端-服务器往返。

    如果您知道更好的解决方案,请添加答案或评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2016-07-29
      • 2011-04-17
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      相关资源
      最近更新 更多