我有一个Cloud Code函数,它传递现有Parse对象的id,操作并保存该对象,并将其返回给客户端(使用JS SDK实现)。这通常很有效,但有一个例外:如果CC函数取消设置先前设置的属性,则客户端仍会在返回的对象中看到旧值(即使该属性在db中正确保存为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}设置'状态。
答案 0 :(得分:0)
我最终使用了一个丑陋的解决方法:每当我调用一个可能会取消设置属性的函数时,我会在返回的对象上调用fetch
以确保我没有看到缓存的值。一个糟糕的解决方案,因为我有第二次客户端 - 服务器往返。
如果您知道更好的解决方案,请添加答案或评论。