在Parse中为Place与User类添加关联时触发未保存对象错误
解决Parse中“You cannot add or remove an unsaved Parse Object from a relation”错误
这个错误的核心原因很明确:你尝试添加到关联(relation)里的user对象,并不是一个已经被Parse服务器持久化的有效Parse对象实例。大概率是你从req.session.user里取到的只是一个普通的JavaScript对象(比如之前存的用户JSON数据),而不是完整的Parse.User实例,Parse会把它判定为“未保存的对象”,所以拒绝添加到关联中。
咱们来一步步修正你的代码:
第一步:确保获取到有效的User实例
不要直接用session里的对象,而是从Parse服务器重新获取用户,保证它是带有完整元数据的已保存对象:
// 假设你的session里存储了用户的objectId,或者直接存了user对象的JSON var userId = req.session.user.objectId; // 或者如果session里直接存userId就直接用 var userQuery = new Parse.Query(Parse.User); userQuery.get(userId) .then(function(fetchedUser) { // 先拿到有效的User实例,再处理Place的逻辑 var placeId = req.body.placeId; var placeQuery = new Parse.Query('Place'); return placeQuery.get(placeId); }) .then(function(place) { place.increment('likeCount'); var relation = place.relation('likes'); // 这里用的是从服务器获取的fetchedUser,是已保存的实例 relation.add(fetchedUser); return place.save(null, {useMasterKey: true}); }) .then(function() { return next(); }) .catch(function(error) { // 这里改用catch来捕获所有Promise链中的错误,之前的then处理错误是不对的 return res.status(500).send(error); });
另一种可选方案:恢复session中的User对象
如果你的session里存的是Parse.User对象的JSON序列化数据,也可以用Parse.Object.fromJSON()来恢复对象,不过最好还是调用fetch()确保对象是最新的:
var user = Parse.Object.fromJSON(req.session.user); user.fetch() .then(function(fetchedUser) { // 后续处理Place的逻辑和上面一致 var placeId = req.body.placeId; var placeQuery = new Parse.Query('Place'); return placeQuery.get(placeId); }) .then(function(place) { place.increment('likeCount'); var relation = place.relation('likes'); relation.add(fetchedUser); return place.save(null, {useMasterKey: true}); }) .then(function() { return next(); }) .catch(function(error) { return res.status(500).send(error); });
额外注意点
- 永远不要假设session里的对象是有效的Parse实例:因为session存储的通常是序列化后的JSON,会丢失Parse对象的类信息和元数据,必须重新获取或恢复。
- 修正错误处理:你之前用最后一个
then来处理错误是不正确的,Promise的错误应该用catch方法来捕获,这样才能覆盖整个链中的异常。
内容的提问来源于stack exchange,提问作者S.Polat
相关产品推荐
相关产品推荐

