为什么我不能在 `beforeSave` 函数中使用 `useMasterKey()`?

Why can't I use `useMasterKey()` in a `beforeSave` function?

我的 Parse 应用程序有一个 GiftCode 集合,它不允许 class 级别的 find 操作。

我正在编写一个 beforeSave 云函数来防止我们的团队从 Parse 的仪表板输入重复代码:

Parse.Cloud.beforeSave('GiftCode', function (req, res) {
  Parse.Cloud.useMasterKey();

  const code = req.object.get('code');

  if (!code) {
    res.success();
  } else {
    const finalCode = code.toUpperCase().trim();

    req.object.set('code', finalCode);

    (new Parse.Query('GiftCode'))
    .equalTo('code', finalCode)
    .first()
    .then((gift) => {
      if (!gift) {
        res.success();
      } else {
        res.error(`GiftCode with code=${finalCode} already exists (objectId=${gift.id})`);
      }
    }, (err) => {
      console.error(err);
      res.error(err);
    });
  }  
});

如您所见,我正在调用 Parse.Cloud.useMasterKey()(这是 Parse 云中的 运行),但我仍然收到以下错误:

This user is not allowed to perform the find operation on GiftCode.

我在其他普通云功能中使用 useMasterKey(),并且能够根据需要执行 find 操作。

useMasterKey()是否不适用于beforeSave函数?

我从未尝试过在 beforeSave 函数中使用主密钥,但如果有一些额外的保护措施来防止它,我不会感到惊讶。从安全的角度来看,它似乎可以使所有 write-based CLP 和 ACL 对于 class.

毫无价值

像这样将主密钥作为选项传递给查询,尝试有选择地使用主密钥

(new Parse.Query('GiftCode'))
.equalTo('code', finalCode)
.first({ useMasterKey: true })
.then((gift) => {
    ...

Parse.Cloud.useMasterKey();已在 Parse Server 版本 2.3.0(2016 年 12 月 7 日)中弃用。从那个版本开始,它是一个空操作(它什么都不做)。您现在应该将 {useMasterKey:true} 可选参数插入代码中需要覆盖 ACL 或 CLP 的每个方法。