101 在云代码中找不到对象 - 解析服务器

Posted

技术标签:

【中文标题】101 在云代码中找不到对象 - 解析服务器【英文标题】:101 Object not found in Cloud Code - Parse Server 【发布时间】:2016-09-21 08:43:48 【问题描述】:

我在使用 Parse-Server 时遇到了一个奇怪的问题。

有时收到以下错误:

ParseError 代码:101,消息:'找不到对象。'

它通常发生在云代码错误之后,在使用该对象的任何函数中,即使其中没​​有更新(例如以下函数,它只是进行查找但如果由于任何原因失败仍然会创建错误,例如一个糟糕的代码行)。但是我不确定这是不是这个原因。

我在 Cloud Code 中有这个简单的功能:

const user = req.user

const card_id = cid(req, user)
const base_error = global.i18n.__('errors.default')

if(!card_id) return res.error(base_error)

console.log('CID: ' + card_id + ' | UID: ' + user.id)

new Parse.Query(global.m.Card).get(card_id)
.then((card) => 
  if((new Date) - card.updatedAt > OSC.syncDelay)
    return _CARD.sync(card.get('onum'))

  return card
)
.then((card) => 
  res.success(card)
)
.then(null, (error) => 
  if(Array.isArray(error)) error = error[0]

  console.log(error) // HERE is where the error is logged
  res.error(base_error)
)

这是 console.log 打印的内容:

CID:PqOMwi5y60 | UID:QldBflokJV

以下是卡 ACL 的定义方式(更新时,而不是创建时):

const cardACL = card.getACL()
cardACL.setReadAccess(user, true)
cardACL.setWriteAccess(user, true)

if(memory.admin) 
  cardACL.setReadAccess(memory.admin, true)
  cardACL.setWriteAccess(memory.admin, true)


card.setACL(cardACL)

最后,这是我的数据库中用于卡片对象权限/ACL 的内容:

"_id" : "PqOMwi5y60",
"_wperm" : [ 
    "role:Administrator", 
    "QldBflokJV"
],
"_rperm" : [ 
    "role:Administrator", 
    "QldBflokJV"
],
"_acl" : 
    "role:Administrator" : 
        "w" : true,
        "r" : true
    

我做错了吗?

【问题讨论】:

【参考方案1】:

因为您的 ACL 在您的查询中包含用户(因为只有用户或管理员可以读取和写入对象),所以您还需要发送登录用户的会话令牌。所以最后你的代码应该如下所示:

const user = req.user

const card_id = cid(req, user)
const base_error = global.i18n.__('errors.default')

if(!card_id) return res.error(base_error)

console.log('CID: ' + card_id + ' | UID: ' + user.id)

new Parse.Query(global.m.Card).get(card_id,
  sessionToken: request.user.get("sessionToken") 
)
.then((card) => 
  if((new Date) - card.updatedAt > OSC.syncDelay)
    return _CARD.sync(card.get('onum'))

  return card
)
.then((card) => 
  res.success(card)
)
.then(null, (error) => 
  if(Array.isArray(error)) error = error[0]

  console.log(error) // HERE is where the error is logged
  res.error(base_error)
)

请注意,我还在查询中发送了会话令牌。

【讨论】:

以上是关于101 在云代码中找不到对象 - 解析服务器的主要内容,如果未能解决你的问题,请参考以下文章

无法从“firebase.js”解析模块“firebase”:在项目中找不到 Firebase

无法删除该对象,因为它在 ObjectStateManager 中找不到

在 Android 中找不到应用程序变量

在数组中找不到对象的位置?

在转发类对象中找不到属性

NPM 安装总是失败,在 .staging 文件夹中找不到 JSON 解析和文件