属性 由 CloudCode 取消设置被本地 Parse 缓存覆盖
Property unset by CloudCode is overwritten by local Parse cache
我有一个 Cloud Code 函数,它获取现有 Parse 对象的 ID,操作并保存该对象,然后 returns 将其发送到客户端(使用 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)
(这实际上可行),因为我想避免使用两个不同的值(null
和 undefined
)来表示'not set' 状态。
我最终使用了一个丑陋的解决方法:每当我调用一个可能取消设置 属性 的函数时,我都会对返回的对象调用 fetch
以确保我没有看到缓存值。性能方面的解决方案很糟糕,因为我有第二次客户端-服务器往返。
如果您知道更好的解决方案,请添加答案或评论。
我有一个 Cloud Code 函数,它获取现有 Parse 对象的 ID,操作并保存该对象,然后 returns 将其发送到客户端(使用 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)
(这实际上可行),因为我想避免使用两个不同的值(null
和 undefined
)来表示'not set' 状态。
我最终使用了一个丑陋的解决方法:每当我调用一个可能取消设置 属性 的函数时,我都会对返回的对象调用 fetch
以确保我没有看到缓存值。性能方面的解决方案很糟糕,因为我有第二次客户端-服务器往返。
如果您知道更好的解决方案,请添加答案或评论。